#!/home/arne/wisp/wisp-multiline.sh
; !#
;; Fibonacci Functions
define : fib 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 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.