atomo programming language — http://atomo-lang.org/
{ evaluate-all: [] in: _ := error: @no-expressions
evaluate-all: [e] in: t := t evaluate: e
evaluate-all: (e . es) in: t :=
{ t evaluate: e
evaluate-all: es in: t
} call
do-input: (s: String) in: env :=
s parse-expressions match: {
[] -> @ok
es -> (evaluate-all: es in: env) show print
}
get-value: t :=
(interaction: "enter value: ") parse-expressions match: {
[] -> get-value: t
es -> evaluate-all: es in: t
}
get-n-values: 0 = []
get-n-values: n :=
(get-value: Lobby) . (get-n-values: (n - 1))
repl-debugger =
Object clone do:
{ run: e :=
{ Restart show-options-for: e
{ basic-repl } bind: {
@prompt ->
restart: 'use-prompt with: ["[!]> "]
@(special: n) ->
when: (n all?: @digit?) do: {
r = Restart get: (n as: Integer)
r jump: (get-n-values: r action arguments length)
}
}
} call
}
(env: Object) basic-repl :=
{ prompt =
{ signal: @prompt; "> " } with-restarts: {
use-prompt -> { p | p }
}
in =
{ interaction: prompt } handle: {
@end-of-input -> { signal: @quit; "" } call
@interrupt -> { signal: @quit; "" } call
}
in match: {
$: . name ->
signal: @(special: name)
source ->
{ try :=
{ do-input: source in: env } with-restarts: {
retry -> try
abort -> @ok
}
try
} call
}
signal: @loop
} repeat
(env: Object) repl :=
{ stop |
with: *debugger* as: repl-debugger do: {
frame = 0
{ env basic-repl } bind: {
@prompt ->
restart: 'use-prompt with: ["[" .. frame show .. "]> "]
@loop -> (super frame = frame + 1)
@(special: "h") ->
":h\thelp" print
@quit ->
{ ask :=
{ "really quit? (y/n) " display
{ read-char } (after: { "" print }) match: {
$y -> stop yield
$n -> @ok
_ -> ask
}
} call
ask
} call
}
}
} call/cc
} call
|