Welcome, I'm happy to see you here! Feel free to add a happy example, the more the merrier!
(math/log (* math/e math/e )) # => 2
(math/log2 256 ) # => 8
(math/log10 1000 ) # => 3
((juxt + - * / ) ;[1 2 3 ])
# => '(6 -4 6 0.166667) janet:2:> (all true? [true true false ])
false
janet:3:> (all even? [2 4 6 7 ])
false
janet:5:> (all even? [2 4 6 ])
true (def a @[])
(array/push a 1 ) # => @[1]
a # => @[1]
(array/push a 2 ) # => @[1 2]
a # => @[1 2]
(print
(prompt :a
(for i 0 1000000000000
(print (string "i=" i ))
(if (= i 2 )
(return :a 10 )))))
# output:
# i=0
# i=1
# i=2
# 10 (def new-bytes 512 )
(var new-buffer (buffer/new new-bytes ))
# --> @"" (loop [x :range [1 10 ]
:let [square (* x x )]
:until (> square 9 )
:before (print "before" )
:after (print "after" )
:repeat 2 ]
(print (string "square: " square )))
# before
# square: 1
# square: 1
# after
# before
# square: 4
# square: 4
# after
# before
# square: 9
# square: 9
# after
(defn inc [x ] (+ x 1 ))
(defn inv [x ] (* x -1 ))
(defn sq [x ] (* x x ))
(-> 2 inc ) # -> 3
(-> 2 inc inc ) # -> 4
(-> 2 inc inc inv ) # -> -4
(-> 2 inc inc inv sq ) # -> 16
(def a @[1 2 3 ])
(def b (array/slice a ))
#=> good way to clone array, a and b are different arrays (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}]
$ janet -e '(os/exit 42 )' ; echo $?
42
# janet 1.10.1
(= [1 1 ] [1 1 ]) # => true
(= [1 1 ] [2 3 ]) # => false
(= [1 1 ] @[1 1 ]) # => false
(= [1 1 ] @[2 3 ]) # => false
(= @[1 1 ] @[1 1 ]) # => false
(= @[1 1 ] @[2 3 ]) # => false
(deep= [1 1 ] [1 1 ]) # => true
(deep= [1 1 ] [2 3 ]) # => false
(deep= [1 1 ] @[1 1 ]) # => false
(deep= [1 1 ] @[2 3 ]) # => false
(deep= @[1 1 ] @[1 1 ]) # => true
(deep= @[1 1 ] @[2 3 ]) # => false (= (brushift 2r1000 1 1 1 ) 2r0001 )
# => true (import spork/charts :as c )
(c/line-chart
:width 400 :height 200
:data {:timestamp [1 2 3 5 40 60 ]
:temperature-1 [75.1 75.2 75.4 75.5 75.5 75.4 ]
:temperature-2 [55.1 55.4 55.7 60.0 60.4 60.9 ]}
:save-as "bla.png"
:x-column :timestamp
:y-column [:temperature-1 :temperature-2 ])
# then open bla.png to view
# bakpakin shared this example (map dictionary? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false false false false false false true true ]
(map struct? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false false false false false false true false ]
(map table? [ 'ab :ab "ab" @"ab" [97 98 ] @[97 98 ] {0 97 1 98 } @{0 97 1 98 } ])
# => @[ false false false false false false false true ] # Consider this problem: As a module author, I want to define a dynamic
# binding `:debug` to provide additional diagnostic information when an
# error occurs in a module function. I'll use `defdyn` to create a public
# alias for my dynamic binding:
# In the file: my-mod.janet
# The `defdyn` macro creates the dynamic binding :debug, and explicitly
# exposes it in the module's API as `my-mod/*debug*`.
(defdyn *debug* )
# contrived function - the important thing is that it enables additional
# diagnostic logging when the `*debug*` alias's reference dynamic binding
# is true.
(defn my-func [& params ]
(try
(do
(when (empty? params )
(error "missing required argument" )))
([err fib ]
(when (dyn *debug* )
(print "[diagnostics] ..." ))
(error (string "error occurred: " err )))))
# Let's test our module from the REPL.
# $ repl:1:> (import /my-mod)
# $ repl:2:> (setdyn my-mod/*debug* true) # enable debug mode
# $ repl:3:> (my-mod/my-func)
# [diagnostics] ...
# error: error occured: missing required argument
# in my-func [my-mod.janet] on line 11, column 7
# in thunk [repl] (tail call) on line 4, column 1
# entering debug[1] - (quit) to exit
# debug[1]:1:>
# We see our diagnostic message, but we also entered Janet's built-in
# debugger! That's not what we intended. Why did this happen?
# It turns out that our module's `my-mod/*debug*` alias is namespaced, but the
# referenced `:debug` dynamic binding is not. We've created a collision with
# the `:debug` dynamic binding in the core API that activates the debugger
# on error.
# $ repl> *debug*
:debug
# $ repl> my-mod/*debug*
:debug
# The solution is to set the :defdyn-prefix dynamic binding to add a namespace
# for all dynamic bindings in our module. We should use a reasonably unique
# prefix - let's go with the name of the module's public git repo. It's okay
# for the prefix to be long - it will be used as the key for the dynamic
# binding in the current environment, but the user won't typically interact
# with it directly. The prefix is effectively "hidden" from the user. We'll
# prepend this line at the top of our module:
(setdyn *defdyn-prefix* "codeberg.org/quexxon/my-mod/" )
# Now our `my-mod/*debug*` alias refers to an isolated, namespaced binding:
# $ repl:1:> (import /my-mod)
# $ repl:2:> my-mod/*debug*
:codeberg.org/quexxon/my-mod/debug
# $ repl:3:> (setdyn my-mod/*debug* true) # enable debug mode
# $ repl:4:> (my-mod/my-func)
# [diagnostics] ...
# error: error occured: missing required argument
# in my-func [my-mod.janet] on line 11, column 7
# in thunk [repl] (tail call) on line 4, column 1
# $ repl:5:>
# Much better! We see our diagnostic message, but we didn't trigger Janet's
# debugger. As a general rule, always set `*defdyn-prefix*` to a unique
# value when defining dynamic bindings for your module. (filter even? [1 2 3 4 5 ]) # => @[2 4]
(filter odd? [1 2 3 4 5 ]) # => @[1 3 5]
(filter (fn [x ] (not (even? x ))) [1 2 3 4 5 ]) # => @[1 3 5]
(filter (complement even? ) [1 2 3 4 5 ]) # => @[1 3 5]
(def fns [even? odd? ])
(map (fn [f ] (filter f [-2 -1 0 1 2 ])) fns ) # => @[ @[-2 0 2] @[-1 1] ]
(def fns (map complement fns ))
(map (fn [f ] (filter f [-2 -1 0 1 2 ])) fns ) # => @[ @[-1 1] @[-2 0 2] ]
(get default-peg-grammar :a )
# => '(range "az" "AZ") (string/replace "+" "-" "ctrl+c" )
# => "ctrl-c" (def b @"" )
(def v (* 1000 (math/random )))
# => 487.181 your number can differ
(xprinf b "Value reached level %f" v )
# => nil
b
# => @"Value reached level 487.181188"