Welcome, I'm happy to see you here! Feel free to pick a function and add a happy example, the more the merrier!
(math/round 1.1 ) # => 1
(map math/round [1.49 1.50 1.51 ]) # => @[1 2 2]
(map int? [ nil true 0 1 3.14 (math/trunc 3.14 ) (band 1.1 2.2 ) ])
# => @[ false false true true false true true ] (math/exp2 8 ) # => 256
(string/find "a" "abcdefa" 1 )
# not yet documented start ^ position
# => 6 (math/hypot 1 1 ) # => 1.41421
(math/sqrt 2 ) # => 1.41421
# If your tooling or the compiler doesn't believe a symbol will be bound e.g.:
(def a b ) # if b e.g. gets bound by some macro or pushed directly to the env
# You can wrap it with compwhen on a bool:
(var- bla false )
(compwhen bla
(def a b ))
# Whatever defines b should then set bla to true
# From: https://codeberg.org/veqq/declarative-dsls/src/branch/master/src/declarative-dsls/logic.janet (type print )
# =>
:cfunction # Some tips for working with bytes and unicode:
(string/bytes "что-нибудь" ) #> (209 135 209 130 208 190 45 208 189 208 184 ...
(print (string/from-bytes 208 176 208 177 )) #> аб
(map string/from-bytes (string/bytes "что-нибудь" )) #> @["\xD1" "\x87" "\xD1" "\x82" "\xD0" "\xBE" ...
# Print renders "\xD1" "\x87" as ч, as unicode characters may have multiple bytes
# So use apply:
(apply print (map string/from-bytes
(string/bytes "что-нибудь" ))) #> что-нибудь (put-in @{:a @{:aa 5 } :b @{:bb 6 }} [:c ] 9 ) # => @{:a @{:aa 5} :b @{:bb 6} :c 9}
(put-in @{:a @{:aa 5 } :b @{:bb 6 }} [:a :aa ] 9 ) # => @{:a @{:aa 9} :b @{:bb 6}}
(put-in @{:a @{:aa 5 } :b @{:bb 6 }} [:a :cc :ddd ] 9 ) # => @{:a @{:cc @{:ddd 9} :aa 5} :b @{:bb 6}}
(put-in @[:a :b @[:aa :bb :cc ]] [2 1 ] :zz ) # => @[:a :b @[:aa :zz :cc]]
(put-in @[:a :b @[:aa :bb :cc ]] [5 ] :z ) # => @[:a :b @[:aa :bb :cc] nil nil :z]
(put-in @[:a :b @[:aa :bb :cc ]] [4 0 ] :zz ) # => @[:a :b @[:aa :bb :cc] nil @{0 :zz}]
(put-in @[:a :b @[:aa :bb :cc ]] [4 :yy ] :zz ) # => @[:a :b @[:aa :bb :cc] nil @{:yy :zz}]
(get-in [[4 5 ] [6 7 ]] [0 ] 42 ) # => (4 5)
(get-in [[4 5 ] [6 7 ]] [0 1 ] 42 ) # => 5
(get-in [[4 5 ] [6 7 ]] [-1 ] 42 ) # => 42
(get-in [[4 5 ] [6 7 ]] [9 9 9 ] 42 ) # => 42
(file/open "iamfile.txt" :r )
(file/open "iamfile.txt" :w )
(file/open "iamfile.txt" :a )(def h ["a" "b" :c ]) # => ("a" "b" :c)
(find (fn [a ] (= "a" a )) h ) # => "a" # sh/$ can't expand "~" so you must build it:
# (def key "D8E4DB18BF87FLEW7402BBE3AA91B16F4A65C4C9") # use your gpg key ID
(defn copy-and-encrypt-password-store [key-id ]
(with [out (file/open "pass-backup.tar.gz.gpg" :w )]
(sh/$ tar -czf - ,(string (os/getenv "HOME" ) "/.password-store" )
| gpg --encrypt --recipient ,key-id > ,out )))
# tar -cz ~/.password-store/ | gpg --encrypt --recipient YOUR_KEY_ID > pass-backup.tar.gz.gpg # Since table/clone produces a shallow copy and composing freeze and thaw makes everything mutable/immutable
(defn deep-clone [ds ]
(prewalk
|(cond
(table? $ ) (table/clone $ )
(array? $ ) (array/slice $ )
(buffer? $ ) (buffer/slice $ )
$ )
ds ))
# CalebF wrote this: https://janet.zulipchat.com/#narrow/channel/409517-help/topic/table.2Fclone.20doesn.27t.20make.20a.20deep.20copy.3F/near/617675442 (count even? [1 2 3 4 5 ]) # => 2
(count (fn [x ] (> x 3 )) [1 2 3 4 5 ]) # => 2
(count |(> $ 3 ) [1 2 3 4 5 ]) # => 2
(count (fn [x ] (truthy? x )) [nil false true 42 :a "foo" ]) # => 4
(count |(truthy? $ ) [nil false true 42 :a "foo" ]) # => 4
(var f even? )
(count f [1 2 3 4 5 ]) # => 2
(set f odd? )
(count f [1 2 3 4 5 ]) # => 3
(map (fn [f ] (count f [1 2 3 4 5 ])) [even? odd? ]) # => @[2 3]
(map |(count $ [1 2 3 4 5 ]) [even? odd? ]) # => @[2 3]