guile: Resurrect eval/apply in scheme.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 27 Jan 2018 15:43:09 +0000 (16:43 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 27 Jan 2018 15:43:09 +0000 (16:43 +0100)
* guile/mes.mes (eval-expand): Short-circuit make-closure.
* guile/mes.scm (environment): Update.

guile/mes.mes
guile/mes.scm

index 38b1ac1af5337bd6375b248d3f029fcfb12c5cc3..4ec945c5d6e9a733afdcbf6865662fc9ef834e71 100644 (file)
@@ -1,7 +1,7 @@
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2018 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; mes.mes: This file is part of Mes.
 ;;;
    ;;((eq? (car fn) 'label) (apply-env (caddr fn) x (cons (cons (cadr fn) (caddr fn)) a)))
    (#t (apply-env (eval-env fn a) x a))))
 
+;;return make_cell_ (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (formals, body)));
+(define (make-closure formals body a)
+  (cons (cons '*closure* #f) (cons (cons '*circ* a) (cons formals body))))
+
 (define (eval-expand e a)
   (cond
    ((eq? e '*undefined*) e)
      ((eq? (car e) 'quote) (cadr e))
      ((eq? (car e) 'syntax) (cadr e))
      ((eq? (car e) 'begin) (eval-begin-env e a))
+     ((eq? (car e) 'lambda) e)
      ((eq? (car e) 'lambda) (make-closure (cadr e) (cddr e) (assq '*closure* a)))
      ((eq? (car e) '*closure*) e)
      ((eq? (car e) 'if) (eval-if-env (cdr e) a))
   (if (eval-env (car e) a) (eval-env (cadr e) a)
       (if (pair? (cddr e)) (eval-env (caddr e) a))))
 
-(define (eval-quasiquote e a)
-  (cond ((null? e) e)
-        ((atom? e) e)
-        ((eq? (car e) 'unquote) (eval-env (cadr e) a))
-        ((and (pair? (car e))
-              (eq? (caar e) 'unquote-splicing))
-         (append2 (eval-env (cadar e) a) (eval-quasiquote (cdr e) a)))
-        (#t (cons (eval-quasiquote (car e) a) (eval-quasiquote (cdr e) a)))))
+;; (define (eval-quasiquote e a)
+;;   (cond ((null? e) e)
+;;         ((atom? e) e)
+;;         ((eq? (car e) 'unquote) (eval-env (cadr e) a))
+;;         ((and (pair? (car e))
+;;               (eq? (caar e) 'unquote-splicing))
+;;          (append2 (eval-env (cadar e) a) (eval-quasiquote (cdr e) a)))
+;;         (#t (cons (eval-quasiquote (car e) a) (eval-quasiquote (cdr e) a)))))
 
 (define (sexp:define e a)
   (if (atom? (cadr e)) (cons (cadr e) (eval-env (caddr e) a))
index ea0f32e2a014546bc55171420e5bd67e42a416b3..1e4ca3f63a882736a44d54a389782574b3d10291 100755 (executable)
@@ -4,7 +4,7 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
 !#
 
 ;;; Mes --- The Maxwell Equations of Software
-;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2018 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -107,7 +107,7 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
   (cond
    ((guile:pair? x) #f)
    ((guile:null? x) #f)
-   (#t x)))
+   (#t #t)))
 
 ;; PRIMITIVES
 (define car guile:car)
@@ -154,72 +154,75 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
 (define (lookup-macro e a)
   #f)
 
+(define guile:dot '#{.}#)
+
 (define environment
   (guile:map
    (lambda (x) (cons (car x) (guile:eval (cdr x) (guile:current-module))))
    '(
-    ((guile:list) . (guile:list))
-    (#t . #t)
-    (#f . #f)
+     (*closure* . #t)
+     ((guile:list) . (guile:list))
+     (#t . #t)
+     (#f . #f)
     
-    (*unspecified* . guile:*unspecified*)
-
-    (atom? . atom?)
-    (car . car)
-    (cdr . cdr)
-    (cons . cons)
-    ;; (cond . evcon)
-    (eq? . eq?)
-
-    (null? . null?)
-    (pair? . guile:pair?)
-    ;;(quote . quote)
-
-    (evlis-env . evlis-env)
-    (evcon . evcon)
-    (pairlis . pairlis)
-    (assq . assq)
-    (assq-ref-env . assq-ref-env)
-
-    (eval-env . eval-env)
-    (apply-env . apply-env)
-
-    (read . read)
-    (display . guile:display)
-    (newline . guile:newline)
-
-    (builtin? . builtin?)
-    (number? . number?)
-    (call . call)
-
-    (< . guile:<)
-    (- . guile:-)
-
-    ;; DERIVED
-    (caar . caar)
-    (cadr . cadr)
-    (cdar . cdar)
-    (cddr . cddr)
-    (caadr . caadr)
-    (caddr . caddr)
-    (cdadr . cdadr)
-    (cadar . cadar)
-    (cddar . cddar)
-    (cdddr . cdddr)
-
-    (append2 . append2)
-    (exit . guile:exit)
-
-    (*macro* . (guile:list))
-    (*dot* . '.)
-
-    ;;
-    (stderr . stderr))))
+     (*unspecified* . guile:*unspecified*)
+
+     (atom? . atom?)
+     (car . car)
+     (cdr . cdr)
+     (cons . cons)
+     ;; (cond . evcon)
+     (eq? . eq?)
+
+     (null? . null?)
+     (pair? . guile:pair?)
+     ;; (quote . quote)
+
+     (evlis-env . evlis-env)
+     (evcon . evcon)
+     (pairlis . pairlis)
+     (assq . assq)
+     (assq-ref-env . assq-ref-env)
+
+     (eval-env . eval-env)
+     (apply-env . apply-env)
+
+     (read . read)
+     (display . guile:display)
+     (newline . guile:newline)
+
+     (builtin? . builtin?)
+     (number? . number?)
+     (call . call)
+
+     (< . guile:<)
+     (- . guile:-)
+
+     ;; DERIVED
+     (caar . caar)
+     (cadr . cadr)
+     (cdar . cdar)
+     (cddr . cddr)
+     (caadr . caadr)
+     (caddr . caddr)
+     (cdadr . cdadr)
+     (cadar . cadar)
+     (cddar . cddar)
+     (cdddr . cdddr)
+
+     (append2 . append2)
+     (exit . guile:exit)
+
+     (*macro* . (guile:list))
+     (*dot* . guile:dot)
+
+     ;;
+     (stderr . stderr))))
 
 (define (main arguments)
-  (let ((program (read-input-file)))
-    ;;(stderr "program:~a\n" program)
-    (guile:display (eval-env program environment)))
+  (let ((program (cons 'begin (read-input-file))))
+    (stderr "program:~a\n" program)
+    (stderr "=> ~s\n" (eval-env program environment)))
   (guile:newline))
 
 (guile:module-define! (guile:resolve-interface '(mes)) 'main main)