]> git.vouivredigital.com Git - vouivre.git/commitdiff
Implement typed curried definitions
authoradmin <admin@vouivredigital.com>
Fri, 22 Sep 2023 04:20:35 +0000 (13:20 +0900)
committeradmin <admin@vouivredigital.com>
Fri, 22 Sep 2023 04:20:35 +0000 (13:20 +0900)
curry.scm

index 77489c4acfe73fd41e51f9aa62776c7028c968dc..33fb629044ee95e177bdde36fdda193fb89be0ec 100644 (file)
--- a/curry.scm
+++ b/curry.scm
@@ -16,6 +16,7 @@
    expand
    parse
    symtab
+   type-of
    ∷))
 
 (define symtab '())
          `(lambda (,var) ,bodye)))))
     (('letrecc1 ((? symbol? name) expr) body)
      (type-error 0 'letrecc1 name expr body))
+    (('definec (? (lambda (x)
+                   (and
+                    (pair? x)
+                    (symbol? (car x))
+                    (var-list? (cdr x))))
+                 (name vars ..1))
+       body)
+     (expand
+      symtab
+      `(definec ,name
+        ,(fold-right (lambda (x prev)
+                       `(λc ,x ,prev))
+                     body vars))))
+    (('definec (? symbol? name) body)
+     (let ((t e (expand symtab body)))
+       (if (not t)
+          (type-error 5 "in body of" `(definec ,name ,body))
+          (begin
+            (∷% name t)
+            (values
+             #f
+             `(define ,name ,e))))))
     ((f)
      (let ((t e (expand symtab f)))
        (values
 
 (define-syntax-rule (∷ name type)
   (∷% 'name (parse 'type)))
+
+(define (type-of x)
+  (pt (assoc-ref symtab x)))