#!/home/arne/wisp/wisp-multiline.sh
; !#
;; Fibonacci Functions
define : fibonacci n
. "Get Fibonacci Element N in Linear Time"
let rek : (i 0) (u 1) (v 1)
if : >= i : - n 2
. v
rek (+ i 1) v (+ u v) ; else
; display : fib 5
;; Try it with curly infix
;; First activate curly infix
. #!curly-infix
;; Now define fibonacci with curly infix.
define : fibonacci n
. "Get Fibonacci Element N in Linear Time"
let rek : (i 0) (u 1) (v 1)
if {i >= {n - 2}}
. v
rek {i + 1} v {u + v}
display
. {1 + 1}
newline
;; Due to the compatibility with curly-infix, the following is no longer possible.
;; Try an infix notation with curly brackets - curly infix from readable as simple macro
;; define-syntax {
;; syntax-rules : { }
;; : { left infix right }
;; infix left right
;;
;; ; display : { 1 + 2 }
;;
;; ;; Now do the fibonacci again
;; define : fibcurl n
;; . "Get Fibonacci Elements in Linear Time"
;; let rek : (i 0) (u 1) (v 1)
;; if : { i >= ({ n - 2 }) }
;; . v
;; rek ({ i + 1 }) v ({ u + v }) ; else
;;
;; ; display : fibcurl 5
;;
;; ;; Do a more complete syntax-rule
;;
;; ;; Try an infix notation with curly brackets - curly infix from readable as simple macro
;; define-syntax {
;; syntax-rules : { }
;; : { l in r }
;; in l r
;; : { { ll lin lr } in r }
;; in (lin ll lr) r
;; : { l in { rl rin rr } }
;; in l (rin rl rr)
;; : { { ll lin lr } in { rl rin rr } }
;; in (lin ll lr) (rin rl rr)
;;
;; ;; And a complete infix-fibonacci
;; define : fibcurl2 n
;; . "Get Fibonacci Elements in Linear Time"
;; let rek : (i 0) (u 1) (v 1)
;; if : { i >= { n - 2 } }
;; . v
;; rek
;; { i + 1 }
;; . v
;; { u + v }
;;
;; ;; But to be frank: Prefix looks better.
;;
;; display : { { 1 + 2 } * { 2 * 3 } }
;; ; display : fibcurl2 5
;; ; TODO: Make the macro recursive, so it can actually cover arbitrary depths of curly braces.