packages feed

snail-0.1.2.1: test/files/fennel-reference.fnl

-- Copied a bunch of examples from https://fennel-lang.org/reference

(fn pxy [x y]
  (print (+ x y)))

(fn pxy [x y]
  (print (+ x y)))

(local pxy (fn [x y]
             (print (+ x y))))

(local functions {})

(fn functions.p [x y z]
  (print (* x (+ y z))))

(set functions.p (fn [x y z]
                   (print (* x (+ y z)))))

(lambda [x ?y z]
  (print (- x (* (or ?y 1) z))))

(fn pxy [x y]
  "Print the sum of x and y"
  (print (+ x y)))

(lambda pxyz [x ?y z]
  "Print the sum of x, y, and z. If y is not provided, defaults to 0."
  (print (+ x (or ?y 0) z)))

(fn add [...]
  {:fnl/docstring "Add arbitrary amount of numbers."
   :fnl/arglist [a b & more]}
  (match (values (select :# ...) ...)
    (0) 0
    (1 a) a
    (2 a b) (+ a b)
    (_ a b) (add (+ a b) (select 3 ...))))

(fn foo []
  {:deprecated "v1.9.0"
   :fnl/docstring "*DEPRECATED* use foo2"}
  )

(fn foo2 [x]
  {:added "v2.0.0"
   :fnl/docstring "Incompatible but better version of foo!"}
  x)

(fn some-function [x ...]
  "Docstring for some-function."
  {:fnl/arglist [x & xs]
   :other :metadata}
  (let [xs [...]] ...))

(fn [a b] (+ a b))

(hashfn (+ $1 $2))

#(+ $1 $2)

(partial (fn [x y] (print (+ x y))) 2)

(let [x 89
      y 198]
  (print (+ x y 12)))

(let [(x y z) (unpack [10 9 8])]
  (+ x y z))

(let [[a b c] [1 2 3]]
  (+ a b c))

(let [{:msg message : val} {:msg "hello there" :val 19}]
  (print message)
  val)

(let [[a b & c] [1 2 3 4 5 6]]
  (table.concat c ","))

(local t [1 2 3 4 5 6])
(setmetatable
 t
 {:__fennelrest (fn [t k]
                  (let [res {}]
                    (for [i k (length t)]
                      (tset res (tostring (. t i)) (. t i)))
                  res))})
(let [[a b & c] t]
  c)

(let [{:a a :b b &as all} {:a 1 :b 2 :c 3 :d 4}]
  (+ a b all.c all.d))

(local tau-approx 6.28318)

(case mytable
  59      :will-never-match-hopefully
  [9 q 5] (print :q q)
  [1 a b] (+ a b))

(case mytable
  [a a] (* a 2)
  [a b] (+ a b))

(case mytable
  [a ?b] :maybe-one-maybe-two-values
  [?a ?a] :maybe-none-maybe-two-same-values
  [?a ?b] :maybe-none-maybe-one-maybe-two-values)

(case mytable
  [a _b] :maybe-one-maybe-two-values
  [_a _a] :maybe-none-maybe-one-maybe-two-values
  [_a _b] :maybe-none-maybe-one-maybe-two-values
  _ :no-match)

(case mytable
  {:subtable [a b ?c] :depth depth} (* b depth)
  _ :unknown)

(case (io.open "/some/file")
  (nil msg) (report-error msg)
  f (read-file f))

(case [91 12 53]
  (where [a b c] (= 5 a)) :will-not-match
  (where [a b c] (= 0 (math.fmod (+ a b c) 2)) (= 91 a)) c)

(case [5 1 2]
  (where (or [a 3 9] [a 1 2]) (= 5 a)) "Either [5 3 9] or [5 1 2]"
  _ "anything else")

(case [1 2 3]
  (where (or [a b 2] [a b 3]) (< a 0) (<= b 1))
  :body)

(let [x 1]
  (case [:hello]
    [x] x))

(let [pass :hunter2]
  (case (user-input)
    (where (= pass)) :login
    _ :try-again!))

(let [x 95]
 (match [52 85 95]
   [b a a] :no
   [x y z] :no
   [a b x] :yes))

(let [name nil
      get-input (fn [] "Dave")]
  (match (get-input)
    name (.. "Hello " name)
    ?no-input (.. "Hello anonymous")))

(match [1 2 3]
  (where [a 2 3] (< 0 a)) "new guard syntax"
  ([a 2 3] ? (< 0 a)) "obsolete guard syntax")

(fn handle [conn token]
  (case-try (conn:receive :*l)
    input (parse input)
    (command-name params (= token)) (commands.get command-name)
    command (pcall command (table.unpack params))
    (catch
     (_ :timeout) nil
     (_ :closed) (pcall disconnect conn "connection closed")
     (_ msg) (print "Error handling input" msg))))

(fn handle [conn token]
  (match-try (conn:receive :*l)
    input (parse input)
    (command-name params token) (commands.get command-name)
    command (pcall command (table.unpack params))
    (catch
      (_ :timeout) nil
      (_ :closed) (pcall disconnect conn "connection closed")
      (_ msg) (print "Error handling input" msg))))

(var x 83)

(let [t {:a 4 :b 8}]
  (set t.a 2) t)

(let [tbl {:d 32} field :d]
  (tset tbl field 19) tbl)

(with-open [fout (io.open :output.txt :w) fin (io.open :input.txt)]
  (fout:write "Here is some text!\n")
  ((fin:lines)))

(let [x (math.random 64)]
  (if (= 0 (% x 10))
      "multiple of ten"
      (= 0 (% x 2))
      "even"
      "I dunno, something else"))

(when launch-missiles?
  (power-on)
  (open-doors)
  (fire))

(local out [])
(each [_ value (pairs tbl) &until (< max-len (length out))]
  (table.insert out value))

(var x 0)
(for [i 1 128 &until (maxed-out? x)]
  (set x (+ x i)))

(for [i 1 10 2]
  (log-number i)
  (print i))

(-?> {:a {:b {:c 42}}}
     (. :a)
     (. :missing)
     (. :c))

(-?>> :a
      (. {:a :b})
      (. {:b :missing})
      (. {:c 42}))

(macros {:my-max (fn [x y]
                   `(let [x# ,x y# ,y]
                      (if (< x# y#) y# x#)))})

(eval-compiler
  (each [name (pairs _G)]
    (print name)))