#!/usr/bin/env sh
# -*- wisp -*-
guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) -c '(import (language wisp spec))'
exec guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -s "$0" "$@"
; !#

;; 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

;; 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 }

display : fibcurl2 5
newline