#!/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.