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