Types, fns and vars are now written in another, better, more intuitive and readable way. Types: "pointer to const char" is "* const char" "array of pointers to volatile int" is "[* volatile int]" Read left to right Vars (as well as fn args, struct fields): (var name type) (struct vec3 ((x float) (y float) (z float)) (fn vec3-add ((v1 vec3) (v2 vec3)) vec3 ...) Also fns are now have return types after arg list. * is now must not be attached to any type name (or variable for that matter)
52 lines
1.5 KiB
Scheme
52 lines
1.5 KiB
Scheme
(include stdio.h)
|
|
|
|
(fn sum ((a int) (b int)) int
|
|
(return (+ a b)))
|
|
|
|
(pub fn main () int
|
|
(var a int 10)
|
|
(var b int 20)
|
|
(var (fn ((int) (int)) int) sum-fn sum)
|
|
|
|
(var (fn ((int) (int)) int) sum-lambda
|
|
|
|
(lambda ((a int) (b int)) int ()
|
|
(return (+ a b))))
|
|
|
|
(var (fn ((int)) int) sum-lambda-2
|
|
|
|
(lambda ((a int)) int ()
|
|
(return (+ a 20))))
|
|
|
|
(printf "Hello from main fn!\n")
|
|
(printf "We will now perform some function calling.\n")
|
|
|
|
(printf "Calling fn ptr: %d\n" (sum-fn a b))
|
|
(printf "Calling lambda: %d\n" (sum-lambda a b))
|
|
(printf "Calling other lambda: %d\n" (sum-lambda-2 a))
|
|
(printf "Calling lambda inplace: %d\n" ((lambda ((a int) (b int)) int ()
|
|
(return (+ a b 100)))
|
|
a b))
|
|
|
|
(var (fn ((int)) int) l-1
|
|
(lambda ((a int)) int ()
|
|
(var (fn ((int)) int) l-2
|
|
(lambda ((a int)) int ()
|
|
(return (+ 60 a))))
|
|
(return (+ 600 (l-2 a)))))
|
|
(printf "Calling nested lambdas: %d\n" (l-1 6))
|
|
|
|
;; Not supported yet
|
|
;; Closure
|
|
;; (var (fn (fn ((int)) int) ((int))) make-adder
|
|
;; (lambda (fn int ((int a))) ()
|
|
;; (return (lambda int ((int b)) (a)
|
|
;; (return (+ a b))))))
|
|
;;
|
|
;; (var (fn int ((int))) add-10
|
|
;; (make-adder 10))
|
|
;; (var (fn int ((int))) add-20
|
|
;; (make-adder 20))
|
|
;; (printf "Calling closures: %d\n" (add-10 24))
|
|
(return 0))
|