mirror of
https://github.com/janet-lang/janet
synced 2024-12-23 06:50:26 +00:00
Replace varset! with algol style :=
This commit is contained in:
parent
f5213e4064
commit
4a76f2ae32
@ -18,6 +18,10 @@ Implemented in mostly standard C99, dst runs on Windows, Linux and macOS.
|
||||
The few features that are not standard C (dynamic library loading, compiler specific optimizations),
|
||||
are fairly straight forward. Dst can be easily ported to new platforms.
|
||||
|
||||
There is not much in the way of documentation yet because it is still a "personal project" and
|
||||
I don't want to freeze features prematurely. You can look in the examples directory, the test directory,
|
||||
or the file `src/compiler/boot.dst` to get a sense of what dst code looks like.
|
||||
|
||||
## Features
|
||||
|
||||
* First class closures
|
||||
|
@ -11,10 +11,11 @@
|
||||
state
|
||||
(do
|
||||
(def n (f))
|
||||
(varset! state n)
|
||||
(varset! loaded true)
|
||||
(:= state n)
|
||||
(:= loaded true)
|
||||
n))))
|
||||
|
||||
# This creates one more closure than necessary but oh well
|
||||
(defmacro delay
|
||||
"Macro for lazy evaluation"
|
||||
[& forms] (tuple mem0 (apply1 tuple (array-concat ['fn []] forms))))
|
||||
|
@ -139,7 +139,7 @@ If no match is found, returns nil"
|
||||
:more (fn [] (< i len))
|
||||
:next (fn []
|
||||
(def ret (get x i))
|
||||
(varset! i (+ i 1))
|
||||
(:= i (+ i 1))
|
||||
ret)
|
||||
})
|
||||
(def iters {
|
||||
@ -156,7 +156,7 @@ If no match is found, returns nil"
|
||||
:more (fn [] (< i top))
|
||||
:next (fn []
|
||||
(def ret i)
|
||||
(varset! i (+ i 1))
|
||||
(:= i (+ i 1))
|
||||
ret)
|
||||
})
|
||||
|
||||
@ -199,9 +199,9 @@ If no match is found, returns nil"
|
||||
(do
|
||||
(def n (next))
|
||||
(if (pred n) n (nextgood)))
|
||||
(varset! alive false))))
|
||||
(defn nnext [] (def ret temp) (varset! temp (nextgood)) ret)
|
||||
(defn nmore [] (when isnew (varset! isnew false) (nnext)) alive)
|
||||
(:= alive false))))
|
||||
(defn nnext [] (def ret temp) (:= temp (nextgood)) ret)
|
||||
(defn nmore [] (when isnew (:= isnew false) (nnext)) alive)
|
||||
{:more nmore :next nnext})
|
||||
|
||||
(defmacro let [bindings & body]
|
||||
@ -213,7 +213,7 @@ If no match is found, returns nil"
|
||||
(array-push accum (tuple 'def
|
||||
(get head i)
|
||||
(get head (+ 1 i))))
|
||||
(varset! i (+ i 2)))
|
||||
(:= i (+ i 2)))
|
||||
(array-push accum (tuple-prepend body 'do))
|
||||
(apply1 tuple accum))
|
||||
|
||||
@ -223,7 +223,7 @@ If no match is found, returns nil"
|
||||
:more (fn [] lastkey)
|
||||
:next (fn []
|
||||
(def ret (tuple lastkey (get x lastkey)))
|
||||
(varset! lastkey (next x lastkey))
|
||||
(:= lastkey (next x lastkey))
|
||||
ret)
|
||||
})
|
||||
|
||||
@ -233,7 +233,7 @@ If no match is found, returns nil"
|
||||
:more (fn [] lastkey)
|
||||
:next (fn []
|
||||
(def ret lastkey)
|
||||
(varset! lastkey (next x lastkey))
|
||||
(:= lastkey (next x lastkey))
|
||||
ret)
|
||||
})
|
||||
|
||||
@ -243,7 +243,7 @@ If no match is found, returns nil"
|
||||
:more (fn [] lastkey)
|
||||
:next (fn []
|
||||
(def ret (get x lastkey))
|
||||
(varset! lastkey (next x lastkey))
|
||||
(:= lastkey (next x lastkey))
|
||||
ret)
|
||||
})
|
||||
|
||||
@ -260,7 +260,7 @@ If no match is found, returns nil"
|
||||
(tuple 'def endsym end)
|
||||
(tuple 'while (tuple '< sym endsym)
|
||||
(tuple-prepend body 'do)
|
||||
(tuple 'varset! sym (tuple '+ sym inc)))))
|
||||
(tuple ':= sym (tuple '+ sym inc)))))
|
||||
|
||||
(defmacro ->
|
||||
[x & forms]
|
||||
@ -311,7 +311,7 @@ If no match is found, returns nil"
|
||||
(pp seen buf k)
|
||||
(buffer-push-string buf " ")
|
||||
(pp seen buf v)
|
||||
(varset! k (next a k))
|
||||
(:= k (next a k))
|
||||
(when k (buffer-push-string buf " ")))
|
||||
(buffer-push-string buf end)))
|
||||
buf)
|
||||
@ -369,7 +369,7 @@ onvalue."
|
||||
(while (< 0 len)
|
||||
(buffer-clear buf)
|
||||
(chunks buf)
|
||||
(varset! len (length buf))
|
||||
(:= len (length buf))
|
||||
(for [i 0 len]
|
||||
(yield (get buf i))))
|
||||
0)))
|
||||
@ -385,17 +385,17 @@ onvalue."
|
||||
(select (fiber-status chars)
|
||||
:new (parser-byte p (resume chars))
|
||||
:pending (parser-byte p (resume chars))
|
||||
(varset! going false))))
|
||||
(:= going false))))
|
||||
(when (not= :root (parser-status p))
|
||||
(onerr "parse" "unexpected end of source"))
|
||||
nil)))
|
||||
(defn more [] (if temp true
|
||||
(do
|
||||
(varset! temp true)
|
||||
(varset! tempval (resume f))
|
||||
(:= temp true)
|
||||
(:= tempval (resume f))
|
||||
going)))
|
||||
(defn next [] (if temp
|
||||
(do (varset! temp nil) tempval)
|
||||
(do (:= temp nil) tempval)
|
||||
(resume f)))
|
||||
{:more more :next next})
|
||||
(fn [env chunks onvalue onerr]
|
||||
|
@ -615,6 +615,7 @@ DstSlot dstc_fn(DstFopts opts, DstAst *ast, int32_t argn, const Dst *argv) {
|
||||
|
||||
/* Keep in lexographic order */
|
||||
static const DstSpecial dstc_specials[] = {
|
||||
{":=", dstc_varset},
|
||||
{"ast-quote", dstc_astquote},
|
||||
{"def", dstc_def},
|
||||
{"do", dstc_do},
|
||||
@ -622,7 +623,6 @@ static const DstSpecial dstc_specials[] = {
|
||||
{"if", dstc_if},
|
||||
{"quote", dstc_quote},
|
||||
{"var", dstc_var},
|
||||
{"varset!", dstc_varset},
|
||||
{"while", dstc_while}
|
||||
};
|
||||
|
||||
|
@ -136,7 +136,7 @@ int dst_core_struct(DstArgs args) {
|
||||
|
||||
int dst_core_fiber(DstArgs args) {
|
||||
DstFiber *fiber;
|
||||
if (args.n < 1) return dst_throw(args, "expected at least one argument");
|
||||
if (args.n < 1) return dst_throw(args, "expected at least 1 argument");
|
||||
if (!dst_checktype(args.v[0], DST_FUNCTION))
|
||||
return dst_throw(args, "expected a function");
|
||||
fiber = dst_fiber(dst_unwrap_function(args.v[0]), 64);
|
||||
|
@ -13,7 +13,7 @@
|
||||
(print " -r Enter the repl after running all scripts")
|
||||
(exit 0))
|
||||
"v" (fn [] (print VERSION) (exit 0))
|
||||
"r" (fn [] (varset! should-repl true))
|
||||
"r" (fn [] (:= should-repl true))
|
||||
})
|
||||
|
||||
(defn dohandler [n]
|
||||
@ -27,7 +27,7 @@
|
||||
(if (= "-" (string-slice arg 0 1))
|
||||
(dohandler (string-slice arg 1 2))
|
||||
(do
|
||||
(varset! no-file false)
|
||||
(:= no-file false)
|
||||
(import arg))))
|
||||
|
||||
(when (or should-repl no-file)
|
||||
|
Loading…
Reference in New Issue
Block a user