(Arne Babenhauserheide)
2014-02-11: now that we support curly braces, rewrite fibonacci to use curly now that we support curly braces, rewrite fibonacci to use curly infix.
diff --git a/examples/fib.w b/examples/fib.w --- a/examples/fib.w +++ b/examples/fib.w @@ -3,7 +3,7 @@ ;; Fibonacci Functions -define : fib n +define : fibonacci n . "Get Fibonacci Element N in Linear Time" let rek : (i 0) (u 1) (v 1) if : >= i : - n 2 @@ -12,51 +12,68 @@ define : fib n ; 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 +;; Try it with curly infix -; display : { 1 + 2 } +;; First activate curly infix +. #!curly-infix -;; Now do the fibonacci again -define : fibcurl n - . "Get Fibonacci Elements in Linear Time" +;; 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 }) } + if {i >= {n - 2}} . v - rek ({ i + 1 }) v ({ u + v }) ; else + rek {i + 1} v {u + v} -; display : fibcurl 5 -;; Do a more complete syntax-rule + +;; 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 : { } - : { 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. +;; 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.