Skip to content

Commit 4d36ba3

Browse files
committed
fix println, prn
1 parent 52af8cf commit 4d36ba3

9 files changed

+181
-162
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ test/**/instructions.append.md
1515
test/**/hints.md
1616
test/**/exemplar.clj
1717
.calva/
18+
.cpcache/
19+
.nrepl-port

deps.edn

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

main.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ import testSuites from './test/tests.json';
77
import { evalString, deftests, clearTests} from "./src/interpreter"
88

99
let editorState = EditorState.create({
10-
doc: `(loop [x [1 2 3] res []]
11-
(let [y 2]
12-
(if (empty? x) res
13-
(recur (rest x) (conj res (* y (first x)))))))`,
10+
doc: `(for* [x [0 1 2 3 4 5]
11+
y [0 1 2 3 4 5]]
12+
(* y x))`,
1413
extensions: [basicSetup, clojure()]
1514
})
1615

@@ -151,4 +150,4 @@ function testExercises() {
151150
//testSolution(randExercise())
152151
//testSolution("proverb")
153152
//loadExercise("lev")
154-
testExercises()
153+
//testExercises()

scratch.clj

+88-127
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@
191191
:cljs (new js/Error (str "Unsupported binding key: " (ffirst kwbs)))))
192192
(reduce process-entry [] bents)))))
193193

194-
(destructure* '[[[bind expr & mod-pairs]
195-
& [[_ next-expr] :as next-groups]]])
194+
(destructure* '[[[bind expr & mod-pairs] & next-groups]])
196195

197196
(def client {:name "Super Co."
198197
:location "Philadelphia"
@@ -236,20 +235,14 @@
236235
n/from-to
237236
(j/assoc! :insert " "))])})))))))
238237

239-
(fn [seq-exprs]
240-
(reduce (fn [groups [k v]]
241-
(if (keyword? k)
242-
(conj (pop groups) (conj (peek groups) [k v]))
243-
(conj groups [k v])))
244-
[] (partition 2 seq-exprs)))
245-
246238
(defmacro for [seq-exprs body-expr]
247239
(let [to-groups (fn [seq-exprs]
248240
(reduce (fn [groups [k v]]
249-
(if (keyword? k)
250-
(conj (pop groups) (conj (peek groups) [k v]))
251-
(conj groups [k v])))
252-
[] (partition 2 seq-exprs)))
241+
(if (keyword? k)
242+
(conj (pop groups) (conj (peek groups) [k v]))
243+
(conj groups [k v])))
244+
[] (partition 2 seq-exprs)))
245+
err (fn [& msg] (throw (IllegalArgumentException. ^String (apply str msg))))
253246
emit-bind (fn emit-bind [[[bind expr & mod-pairs]
254247
& [[_ next-expr] :as next-groups]]]
255248
(let [giter (gensym "iter__")
@@ -261,6 +254,7 @@
261254
(= k :when) `(if ~v
262255
~(do-mod etc)
263256
(recur (rest ~gxs)))
257+
(keyword? k) (err "Invalid 'for' keyword " k)
264258
next-groups
265259
`(let [iterys# ~(emit-bind next-groups)
266260
fs# (seq (iterys# ~next-expr))]
@@ -287,7 +281,8 @@
287281
~(do-cmod etc)
288282
(recur
289283
(unchecked-inc ~gi)))
290-
284+
(keyword? k)
285+
(err "Invalid 'for' keyword " k)
291286
:else
292287
`(do (chunk-append ~gb ~body-expr)
293288
(recur (unchecked-inc ~gi)))))]
@@ -313,127 +308,93 @@
313308
`(let [iter# ~(emit-bind (to-groups seq-exprs))]
314309
(iter# ~(second seq-exprs)))))
315310

316-
(for [x [0 1 2 3 4 5]
317-
:let [y (* x 3)]
318-
:when (even? y)]
319-
y)
320-
321-
322-
323-
(defn to-groups [seq-exprs]
324-
(reduce (fn [groups binding]
325-
(if (keyword? (first binding))
326-
(conj (pop groups)
327-
(conj (peek groups)
328-
[(first binding) (last binding)]))
329-
(conj groups [(first binding) (last binding)])))
330-
[] (partition 2 seq-exprs)))
331-
332-
(let [[[[bind expr & mod-pairs]
333-
& [[_ next-expr] :as next-groups]]]]
334-
(to-groups '[x [1 2 3]
335-
y [1 2 3]
336-
:while (<= x y)
337-
z [1 2 3]]))
338-
339-
(let [giter (gensym "iter__")
340-
gxs (gensym "s__")
341-
do-mod (fn do-mod [[[k v :as pair] & etc]])])
342-
343-
(defn do-mod [[pair & etc]]
311+
(declare do-mod)
312+
(declare do-mod*)
313+
314+
(defn emit-bind [bindings body-expr]
315+
(let [giter (gensym)
316+
gxs (gensym)]
317+
(println "bindings:" bindings)
318+
(if (next bindings)
319+
`(defn ~giter [~gxs]
320+
(loop [~gxs ~gxs]
321+
(when-first [~(ffirst bindings) ~gxs]
322+
~(do-mod* (subvec (first bindings) 2) body-expr bindings giter gxs))))
323+
`(defn ~giter [~gxs]
324+
(loop [~gxs ~gxs]
325+
(when-let [~gxs (seq ~gxs)]
326+
(let [~(ffirst bindings) (first ~gxs)]
327+
~(do-mod* (subvec (first bindings) 2) body-expr bindings giter gxs))))))))
328+
329+
(defn do-mod [domod body-expr bindings giter gxs]
344330
(cond
345-
(= k :let) `(let ~v ~(do-mod etc))
346-
(= k :while) `(when ~v ~(do-mod etc))
347-
(= k :when) `(if ~v
348-
~(do-mod etc)
349-
(recur (rest ~gxs)))
350-
next-groups
351-
`(let [iterys# ~(emit-bind next-groups)
352-
fs# (seq (iterys# ~next-expr))]
331+
(= (ffirst domod) :let) `(let ~(second (first domod)) ~(do-mod (next domod) body-expr bindings giter gxs))
332+
(= (ffirst domod) :while) `(when ~(second (first domod)) ~(do-mod (next domod) body-expr bindings giter gxs))
333+
(= (ffirst domod) :when) `(if ~(second (first domod))
334+
~(do-mod (next domod) body-expr bindings giter gxs)
335+
(recur (rest ~gxs)))
336+
(keyword? (ffirst domod)) (str "Invalid 'for' keyword " (ffirst domod))
337+
(next bindings)
338+
`(let [iterys# ~(emit-bind (next bindings) body-expr)
339+
fs# (seq (iterys# ~(second (first (next bindings)))))]
353340
(if fs#
354341
(concat fs# (~giter (rest ~gxs)))
355342
(recur (rest ~gxs))))
356343
:else `(cons ~body-expr
357344
(~giter (rest ~gxs)))))
358345

359-
(defmacro for [seq-exprs body-expr]
360-
(let [emit-bind
361-
(fn emit-bind [[[bind expr & mod-pairs]
362-
& [[_ next-expr] :as next-groups]]]
363-
(let [giter (gensym "iter__")
364-
gxs (gensym "s__")
365-
do-mod (fn do-mod [[[k v :as pair] & etc]]
366-
(cond
367-
(= k :let) `(let ~v ~(do-mod etc))
368-
(= k :while) `(when ~v ~(do-mod etc))
369-
(= k :when) `(if ~v
370-
~(do-mod etc)
371-
(recur (rest ~gxs)))
372-
next-groups
373-
`(let [iterys# ~(emit-bind next-groups)
374-
fs# (seq (iterys# ~next-expr))]
375-
(if fs#
376-
(concat fs# (~giter (rest ~gxs)))
377-
(recur (rest ~gxs))))
378-
:else `(cons ~body-expr
379-
(~giter (rest ~gxs)))))]
380-
(if next-groups
381-
#_"not the inner-most loop"
382-
`(fn ~giter [~gxs]
383-
(lazy-seq
384-
(loop [~gxs ~gxs]
385-
(when-first [~bind ~gxs]
386-
~(do-mod mod-pairs)))))
387-
#_"inner-most loop"
388-
(let [gi (gensym "i__")
389-
gb (gensym "b__")
390-
do-cmod (fn do-cmod [[[k v :as pair] & etc]]
391-
(cond
392-
(= k :let) `(let ~v ~(do-cmod etc))
393-
(= k :while) `(when ~v ~(do-cmod etc))
394-
(= k :when) `(if ~v
395-
~(do-cmod etc)
396-
(recur
397-
(unchecked-inc ~gi)))
398-
399-
:else
400-
`(do (chunk-append ~gb ~body-expr)
401-
(recur (unchecked-inc ~gi)))))]
402-
`(fn ~giter [~gxs]
403-
(lazy-seq
404-
(loop [~gxs ~gxs]
405-
(when-let [~gxs (seq ~gxs)]
406-
(if (chunked-seq? ~gxs)
407-
(let [c# (chunk-first ~gxs)
408-
size# (int (count c#))
409-
~gb (chunk-buffer size#)]
410-
(if (loop [~gi (int 0)]
411-
(if (< ~gi size#)
412-
(let [~bind (.nth c# ~gi)]
413-
~(do-cmod mod-pairs))
414-
true))
415-
(chunk-cons
416-
(chunk ~gb)
417-
(~giter (chunk-rest ~gxs)))
418-
(chunk-cons (chunk ~gb) nil)))
419-
(let [~bind (first ~gxs)]
420-
~(do-mod mod-pairs)))))))))))]
421-
`(let [iter# ~(emit-bind (to-groups seq-exprs))]
422-
(iter# ~(second seq-exprs)))))
346+
(defn do-mod* [domod body-expr bindings giter gxs]
347+
(if (next bindings)
348+
`(let [iterys# ~(emit-bind (next bindings) body-expr)
349+
fs# (seq (iterys# ~(second (first (next bindings)))))]
350+
(if fs#
351+
(concat fs# (~giter (rest ~gxs)))
352+
(recur (rest ~gxs))))
353+
`(cons ~body-expr
354+
(~giter (rest ~gxs)))))
423355

424-
(for [x [0 1 2 3 4 5]
425-
:let [y (* x 3)]
426-
:when (even? y)]
427-
y)
356+
(defmacro for* [seq-exprs body-expr]
357+
(let [to-groups (fn [seq-exprs]
358+
(reduce (fn [groups kv]
359+
(if (keyword? (first kv))
360+
(conj (pop groups) (conj (peek groups) [(first kv) (last kv)]))
361+
(conj groups [(first kv) (last kv)])))
362+
[] (partition 2 seq-exprs)))]
363+
`(let [iter# ~(emit-bind (to-groups seq-exprs) body-expr)]
364+
(iter# ~(second seq-exprs)))))
365+
366+
(defmacro for* [seq-exprs body-expr]
367+
(let [to-groups (fn [seq-exprs]
368+
(reduce (fn [groups kv]
369+
(if (keyword? (first kv))
370+
(conj (pop groups) (conj (peek groups) [(first kv) (last kv)]))
371+
(conj groups [(first kv) (last kv)])))
372+
[] (partition 2 seq-exprs)))]
373+
`(let [iter# ~(emit-bind (to-groups seq-exprs) body-expr)]
374+
~(second seq-exprs))))
375+
376+
(for* [x ['a 'b 'c]
377+
y [1 2 3]]
378+
[x y])
379+
380+
(for* [x [0 1 2 3 4 5]
381+
y [0 1 2 3 4 5]
382+
z [0 1 2 3 4 5]
383+
:let [y (* x 3)]
384+
:when (even? y)]
385+
y)
428386

429-
(for [x [0 1 2]
430-
y [0 1 2]]
431-
[x y])
387+
(for* [[x y] '([:a 1] [:b 2] [:c 0]) :when (= y 0)] x)
432388

433-
(to-groups '[x [0 1 2]
434-
y [0 1 2]])
389+
(for* [x (range 1 6)
390+
:let [y (* x x)
391+
z (* x x x)]]
392+
[x y z])
435393

436-
[[[0 0] [0 1]]
437-
[[0 2] [1 0]]
438-
[[1 1] [1 2]]
439-
[[2 0] [2 1]]]
394+
(for* [x [1 2 3]
395+
y [1 2 3]
396+
:while (<= x y)
397+
z [1 2 3]
398+
z1 [4 5 6]
399+
z2 [7 8 9]]
400+
[x y z])

src/clj/core.clj

+51-1
Original file line numberDiff line numberDiff line change
@@ -318,4 +318,54 @@
318318
(if (< (count s) 2)
319319
(upper-case s)
320320
(str (upper-case (subs s 0 1))
321-
(upper-case (subs s 1))))))
321+
(upper-case (subs s 1))))))
322+
323+
(defn reduce-kv [m f init]
324+
(reduce (fn [ret kv] (f ret (first kv) (last kv))) init m))
325+
326+
(defmacro when-let [bindings & body]
327+
(let [form (get bindings 0) tst (get bindings 1)]
328+
`(let [temp# ~tst]
329+
(when temp#
330+
(let [~form temp#]
331+
~@body)))))
332+
333+
(defmacro when-first [bindings & body]
334+
(let [xs bindings]
335+
`(when-let [xs# (seq ~xs)]
336+
(let [~(first xs) (first xs#)]
337+
~@body))))
338+
339+
(defn emit-bind [bindings body-expr]
340+
(let [giter (gensym)
341+
gxs (gensym)]
342+
(if (next bindings)
343+
`(defn ~giter [~gxs]
344+
(loop [~gxs ~gxs]
345+
(when-first [~(ffirst bindings) ~gxs]
346+
~(do-mod* (subvec (first bindings) 2) body-expr bindings giter gxs))))
347+
`(defn ~giter [~gxs]
348+
(loop [~gxs ~gxs]
349+
(when-let [~gxs (seq ~gxs)]
350+
(let [~(ffirst bindings) (first ~gxs)]
351+
~(do-mod* (subvec (first bindings) 2) body-expr bindings giter gxs))))))))
352+
353+
(defn do-mod* [domod body-expr bindings giter gxs]
354+
(if (next bindings)
355+
`(let [iterys# ~(emit-bind (next bindings) body-expr)
356+
fs# (seq (iterys# ~(second (first (next bindings)))))]
357+
(if fs#
358+
(concat fs# (~giter (rest ~gxs)))
359+
(recur (rest ~gxs))))
360+
`(cons ~body-expr
361+
(~giter (rest ~gxs)))))
362+
363+
(defmacro for* [seq-exprs body-expr]
364+
(let [to-groups (fn [seq-exprs]
365+
(reduce (fn [groups kv]
366+
(if (keyword? (first kv))
367+
(conj (pop groups) (conj (peek groups) [(first kv) (last kv)]))
368+
(conj groups [(first kv) (last kv)])))
369+
[] (partition 2 seq-exprs)))]
370+
`(let [iter# ~(emit-bind (to-groups seq-exprs) body-expr)]
371+
(iter# ~(second seq-exprs)))))

src/core.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ function str() {
2020
}
2121

2222
function prn() {
23-
println.apply({}, Array.prototype.map.call(arguments, function (exp) {
23+
_println.apply({}, Array.prototype.map.call(arguments, function (exp) {
2424
return _pr_str(exp, true);
2525
}));
2626
}
2727

2828
function println() {
29-
println.apply({}, Array.prototype.map.call(arguments, function (exp) {
29+
_println.apply({}, Array.prototype.map.call(arguments, function (exp) {
3030
return _pr_str(exp, false);
3131
}));
3232
}
@@ -483,6 +483,10 @@ function dec2bin(dec) {
483483
return calls
484484
}
485485

486+
function _subvec(v, start, end) {
487+
return v.slice(start, end)
488+
}
489+
486490
// types.ns is namespace of type functions
487491
export var ns = {
488492
'type': types._obj_type,
@@ -540,6 +544,7 @@ export var ns = {
540544
'str/upper-case': upperCase,
541545
'Character/isLetter': isLetter,
542546
'subs': _substring,
547+
'subvec': _subvec,
543548

544549
'list': types._list,
545550
'list?': types._list_Q,

0 commit comments

Comments
 (0)