Welcome, I'm happy to see you here! Feel free to pick a function and add a happy example, the more the merrier!
(os/shell "touch foo" )
(os/stat "foo" :modified ) # => 1593836002
(os/touch "foo" )
(os/stat "foo" :modified ) # => 1593836013 # To resume an image's environment:
# With this example image:
# echo "(def a 1)" > test.janet
# janet -c test.janet test.jimage
# Now open the REPL:
# To enter an image, for continued development or exploration. N.b. this does not work as expected:
# See: https://janet.zulipchat.com/#narrow/channel/409517-help/topic/Image.20Based.20Development.3F/with/529177765
(defn restore-image [image ]
(loop [[k v ] :pairs image ]
(put (curenv ) k v )))
(restore-image (load-image (slurp "test.jimage" )))(os/shell "uptime > /tmp/uptime.txt" ) # => 0
(slurp "/tmp/uptime.txt" )
# => @"22:33 up 5 days, 9:34, 15 users, load averages: 1.93 1.74 1.59\n"
(os/rm "/tmp/uptime.txt" ) # => nil (+ 1 2 3 ) # => 6
(sum [1 2 3 ]) # => 6 (ev/spawn (os/sleep 1 ) (print "Hard work is done!" ))
# prints "Hard work is done!" after one second
# this is the easiest way to put some forms on the event loop
# but do not forget REPL is blocking, for now, so run the example with `janet -e` (let [p @{:a 1 }
t @{:b 2 }]
(table/setproto t p )
[(get t :a ) (table/rawget t :a )])
# => '(1 nil) (group-by
(fn [i ] (i :label ))
[{:label 'A :value 4 } {:label 'A :value 3 } {:label 'B :value 5 }])
# @{A @[{:label A :value 4} {:label A :value 3}] B @[{:label B :value 5}]}
(interpose 0 [1 2 3 ])
# -> @[1 0 2 0 3] (update @[3 4 5 ] 1 dec ) # => @[3 3 5]
(update (update @[3 4 5 ] 1 dec ) 2 inc ) # => @[3 3 6]
(or true ) # => true
(or true true ) # => true
(or true false ) # => true
(or false 1 2 ) # => 1
(or false 2 1 ) # => 2
(or false nil ) # => nil
(or nil false ) # => false
# note that `or` does not behave as you might expect
# when used with `apply` and `splice`:
(or 1 2 3 ) # => 1
(or (splice [1 2 3 ])) # => (1 2 3)
(apply or [1 2 3 ]) # => (if 1 1 (if 2 2 3))
# Suppose you have a fiber that yields chunks of paginated api results:
(def api-results (fiber/new (fn [] (yield [1 2 3 ]) (yield [4 5 6 ]))))
# Using :iterate, the right side of the binding is evaluated each time the loop is run,
# which allows for running a side-effecting expression that may be different each time.
(loop [_ :iterate (fiber/can-resume? api-results )] (pp (resume api-results )))
# This example can be simplified using :generate
(loop [chunk :generate api-results ] (pp chunk ))
(map bytes? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ true true true true false false false false ]
(map symbol? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ true false false false false false false false ]
(map keyword? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false true false false false false false false ]
(map string? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false false true false false false false false ]
(map buffer? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false false false true false false false false ] (defn test
[x ]
(cond
(> x 10 ) "Pretty big!"
(< x 5 ) "Quite small"
"Medium size" ))
(test 40 ) # => "Pretty big!"
(test 2 ) # => "Quite small"
(test 6 ) # => "Medium size" (map |($ {:a 7 :b 8 } ) [ keys values kvs pairs ])
# => @[ @[:a :b] @[7 8] @[:a 7 :b 8] @[(:a 7) (:b 8)] ]
(map |($ [4 5 6 ] ) [ keys values kvs pairs ])
# => @[ @[0 1 2] @[4 5 6] @[0 4 1 5 2 6] @[(0 4) (1 5) (2 6)] ]
(map |($ 'ab ) [ keys values kvs pairs ])
# => @[ @[0 1] @[97 98] @[0 97 1 98] @[(0 97) (1 98)] ]
(map |($ :ab ) [ keys values kvs pairs ])
# => @[ @[0 1] @[97 98] @[0 97 1 98] @[(0 97) (1 98)] ]
(map |($ "ab" ) [ keys values kvs pairs ])
# => @[ @[0 1] @[97 98] @[0 97 1 98] @[(0 97) (1 98)] ]
(varglobal "smile" false )
# => nil
smile
# => false
(set smile true )
# => smile
smile
# => true
(dyn 'smile )
# => @{:ref @[true]}