Skip to content

Instantly share code, notes, and snippets.

@cellularmitosis

cellularmitosis/Makefile

Last active Aug 20, 2020
Embed
What would you like to do?
Janet Exercism: Implement map

Blog 2020/8/5

<- previous | index | next ->

Janet Exercism: Implement map

Here are Janet solutions (recursive and iterative) to the exercism "implement map without using map" problem.

For some reason, the exercism folks call this problem "accumulate".

test-all: mymap-iter mymap-recur mymap-iter.janet mymap-recur.janet
chmod +x mymap-recur.janet mymap-iter.janet
./mymap-recur.janet
./mymap-recur
./mymap-iter.janet
./mymap-iter
mymap-iter: mymap-iter.janet
jpm quickbin mymap-iter.janet mymap-iter
mymap-recur: mymap-recur.janet
jpm quickbin mymap-recur.janet mymap-recur
clean:
rm -f mymap-recur mymap-iter mymap-recur.c mymap-iter.c
.PHONY: clean test-all
#!/usr/bin/env janet
(defn mymap-iter [f arr]
(var arr2 @[])
(each x arr
(array/push arr2 (f x)))
arr2)
(defn square [x]
(* x x))
(defn main [& args]
(pp (mymap-iter square [1 2 3]))
(pp (mymap-iter square [])))
#!/usr/bin/env janet
# conceptually, what we want is this:
# (defn mymap [f arr]
# (join (f (head arr)) (mymap f (tail arr))))
(defn mymap-recur [f arr]
(if (= 0 (length arr))
[]
(tuple (f (first arr)) (splice (mymap-recur f (slice arr 1))))))
(defn square [x]
(* x x))
(defn main [& args]
(pp (mymap-recur square [1 2 3]))
(pp (mymap-recur square [])))
@andrewchambers

This comment has been minimized.

Copy link

@andrewchambers andrewchambers commented Aug 6, 2020

Recursion with an index, some sort of middle ground.

(defn map-into [f a ind &opt from]
  (default from 0)
  (if (>= from (length ind))
    a
    (do
      (array/push a (f (in ind from)))
      (map-into f a ind (inc from)))))

(defn map [f ind]
  (map-into f @[] ind))

(pp (map inc [1 2 3]))
@cellularmitosis

This comment has been minimized.

Copy link
Owner Author

@cellularmitosis cellularmitosis commented Aug 6, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.