Welcome, I'm happy to see you here! Feel free to add a happy example, the more the merrier!
(def [stdin-r stdin-w ] (os/pipe ))
(def [stdout-r stdout-w ] (os/pipe ))
# write the input that will be sent to sed
(:write stdin-w "hello world 1\nhello world 2" )
(:close stdin-w )
(os/execute
["sed" "s|world|janet|g" ]
:px
# the program reads from :in and writes to :out
{:in stdin-r :out stdout-w })
(:read stdout-r math/int32-max )
# => @"hello janet 1\nhello janet 2"
# feed two lines to sed, which replaces "world"
# with "janet", and read the modified results back (print (doc-format "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 30 ))
Lorem ipsum dolor
sit amet , consectetur
adipiscing elit , sed
do eiusmod tempor
incididunt ut labore
et dolore magna
aliqua. Ut enim ad
minim veniam , quis
nostrud exercitation
ullamco laboris nisi
ut aliquip ex ea
commodo consequat.
(os/shell "touch foo" )
(os/stat "foo" :modified ) # => 1593836002
(os/touch "foo" )
(os/stat "foo" :modified ) # => 1593836013 (peg/find-all ':d "Battery temperature: 40 °C" )
# => @[21 22] indices containing digits
# :d (range "09")
# peg grammars are contained in a table @{} (mutable) located in boot.janet source file.
(string/replace "+" "-" "ctrl+c" )
# => "ctrl-c" (defn- parse-timestamp
``Parse a date or datetime string into a unix epoch int``
[s ]
(if (string/find " " s )
# datetime: "yyyy-MM-dd HH:mm"
(let [[date-part time-part ] (string/split " " s )
[y m d ] (string/split "-" date-part )
[hh mm ] (string/split ":" time-part )]
(os/mktime {:year (scan-number y )
:month (scan-number m )
:month-day (scan-number d )
:hours (scan-number hh )
:minutes (scan-number mm )
:seconds 0 }))
# date: "yyyy-MM-dd"
(let [[y m d ] (string/split "-" s )]
(os/mktime {:year (scan-number y )
:month (scan-number m )
:month-day (scan-number d )
:hours 0 :minutes 0 :seconds 0 }))))(invert :yo )
# => @{111 1 121 0} (as?-> [1 2 3 ] _
(sum _ )
(when (> 6 _ ) _ ))
# => nil
(as?-> [1 2 3 ] _
(sum _ )
(when (>= 6 _ ) _ ))
# => 6
(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}]}
(string/slice "hello" ) # => "hello"
(string/slice "hello" 0 ) # => "hello"
(string/slice "hello" 1 ) # => "ello"
(string/slice "hello" 4 ) # => "o"
(string/slice "hello" 5 ) # => ""
(string/slice "hello" -1 ) # => ""
(string/slice "hello" -2 ) # => "o"
(string/slice "hello" -5 ) # => "ello"
(string/slice "hello" -6 ) # => "hello"
(string/slice "hello" 1 1 ) # => ""
(string/slice "hello" 1 2 ) # => "e"
(string/slice "hello" 1 5 ) # => "ello"
(string/slice "hello" -5 -4 ) # => "e"
(string/slice "hello" -6 -4 ) # => "he"
(string/slice "hello" 2 1 ) # => ""
(string/slice "hello" -1 -2 ) # => ""
(array/slice [1 2 3 ])
#=> @[1 2 3]
# good way to convert tuple to array (parse "[:a :b :c]" ) # => [:a :b :c] # catch and propagate an error with fiber
(try
(+ 1 nil )
([err fib ]
(propagate err fib )))(/ 2 )
# => 0.5
(string/join @["1" "2" "3" ]) # => "123"
# The esp argument is optional, and defaults to empty string (reduce string "ha" ["ha" "ha" "ha" "ha" ]) # => "hahahahaha"
(accumulate string "ha" ["ha" "ha" "ha" "ha" ]) # => @["haha" "hahaha" "hahahaha" "hahahahaha"] (->> (range 10 ) (map (fn [arg ] (* arg arg ))))
# => @[0 1 4 9 16 25 36 49 64 81] # use (dyn :args) to get the value of dynamic binding *args*
(let [args (dyn :args )]
(if (= "-h" (get args 1 ))
(print "Usage: janet args.janet [-h] ARGS.." )
(printf "command line arguments:\n %q" args )))
(seq [i :range [0 3 ]
j :range [0 3 ]]
[(keyword (string/format "%c" (+ 97 i )))
j ])
# => '@[(:a 0) (:a 1) (:a 2) (:b 0) (:b 1) (:b 2) (:c 0) (:c 1) (:c 2)] (defn dataframe
``Create an empty dataframe with the given columns``
[& columns ]
(tabseq [c :in columns ] c @[]))