From 40bbb3dff11c85b649c4aeda0e741cc3e3ac25fc Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 17 Jul 2016 10:38:29 +0200 Subject: [PATCH] mes.c: another macro clue-bat in apply. now macro.mes equals guile -s macro.mes. --- macro.mes | 91 +++++++++++++++++++++++++++++++++++++++++------------- mes.c | 30 +++++++++++++++++- syntax.mes | 19 ++++++------ 3 files changed, 107 insertions(+), 33 deletions(-) diff --git a/macro.mes b/macro.mes index 90f4ec2a..5b212a8a 100644 --- a/macro.mes +++ b/macro.mes @@ -11,30 +11,77 @@ ;; (display (run 4)) ;; (newline) -(define (fm a) - (define-macro (a b) - (display b) - (newline))) +;; (define (fm a) +;; (define-macro (a b) +;; (display b) +;; (newline) +;; "boo")) -(display "f-define-macro: ") -(fm 'dinges) -(a c) +;; (display "f-define-macro: ") +;; (fm 'dinges) +;; (a c) +;; (newline) + + +;; (define-macro (m a) +;; `(define-macro (,a b) +;; (display "b") +;; (display b) +;; (newline))) + +;; (display "define-macro: ") +;; (m dinges) +;; (newline) +;; (display "running dinges: ") +;; (dinges c) +;; (newline) + + +(define-macro (d-s n t) + ;; (display "D-S: ") + ;; (display `(define-macro (,n . a) + ;; (,t (cons ',n a)))) + ;; (newline) + `(define-macro (,n . args) + ;; (display "CALLING: t: ") + ;; (display ,t) + ;; (display " args: ") + ;; (display (cons ',n a)) + ;; (newline) + ;; (display "HALLO: ==>") + ;; (display (,t (cons ',n a))) + ;; ;; (display "HALLO: ==>") + ;; ;; (display (,t (cons ',n a))) + ;; (newline) + (,t (cons ',n args)) + ) + ) + +(d-s s-r + (lambda (. n-a) + (display "YEAH:") + (display n-a) + (newline) + '(lambda (. i) ;;(i r c) + (display "transformers") + (newline) + ''tee-hee-hee + ) + ;; (define (foo) (display "Footje") (newline) 'f-f-f) + ;; foo + ;;"blaat" + ) + ;;(let ()) + ) + +(display "calling s-r") (newline) +(d-s when + (s-r 0 1 2) + ) - -(define-macro (m a) - `(define-macro ;;(,a) - (,a b) - (display "b") - (display b) ;; todo - (newline))) - -(display "define-macro: ") -(m dinges) +(display "calling when") (newline) -(display "running dinges: ") -(dinges c) +(display (when 3 4 5)) (newline) - -(newline) -3 +'dun diff --git a/mes.c b/mes.c index 77264a64..10d4cd62 100644 --- a/mes.c +++ b/mes.c @@ -273,6 +273,9 @@ apply_env_ (scm *fn, scm *x, scm *a) printf (" x="); display (x); puts (""); +#endif +#if MACROS + scm *macro; #endif if (atom_p (fn) != &scm_f) { @@ -288,6 +291,30 @@ apply_env_ (scm *fn, scm *x, scm *a) return begin_env (cddr (fn), pairlis (cadr (fn), x, a)); else if (car (fn) == &scm_label) return apply_env (caddr (fn), x, cons (cons (cadr (fn), caddr (fn)), a)); +#if MACROS + else if ((macro = assq (car (fn), cdr (assq (&scm_macro, a)))) != &scm_f) { +#if DEBUG + printf ("APPLY GOTTA MACRO! name="); + display (car (fn)); + printf (" body="); + display (cdr (macro)); + printf (" args="); + display (cdr (fn)); + puts (""); +#endif + scm *r = apply_env (cdr (macro), cdr (fn), a); +#if DEBUG + printf ("APPLY MACRO GOT: ==> "); + display (r); + puts (""); +#endif + return apply_env (r, x, a); + //return eval_ (cons (r, x), a); + //return apply_env_ (eval (cdr (macro), a), x, a); + //return eval (apply_env_ (cdr (macro), x, a), a); + //return eval (apply_env_ (eval (cdr (macro), a), x, a), a); + } +#endif // MACROS return &scm_unspecified; } @@ -831,7 +858,8 @@ display_helper (scm *x, bool cont, char *sep, bool quote) } else if (atom_p (x) == &scm_t) printf ("%s", x->name); - return &scm_unspecified; + //return &scm_unspecified; + return x; // FIXME: eval helper for macros } // READ diff --git a/syntax.mes b/syntax.mes index c62be6ef..513900e3 100644 --- a/syntax.mes +++ b/syntax.mes @@ -51,9 +51,8 @@ ;; (newline) `(define-macro (,macro-name . args) (,transformer (cons ',macro-name args) - (lambda (x) x) - eq?) - ;;"blaat" + (lambda (x) x) + eq?) )) ;; (define-macro (mes:define-syntax form expander) @@ -83,7 +82,7 @@ (mes:define-syntax syntax-rules (let () - ;;begin + ;;begin (define name? symbol?) @@ -103,7 +102,7 @@ (lambda (exp r c) - (define %input (r '%input)) ;Gensym these, if you like. + (define %input (r '%input)) ;Gensym these, if you like. (define %compare (r '%compare)) (define %rename (r '%rename)) (define %tail (r '%tail)) @@ -158,7 +157,7 @@ (define (process-segment-match input pattern) (let ((conjuncts (process-match '(car l) pattern))) (if (null? conjuncts) - `((list? ,input)) ;+++ + `((list? ,input)) ;+++ `((let loop ((l ,input)) (or (null? l) (and (pair? l) @@ -176,7 +175,7 @@ ((segment-pattern? pattern) (process-pattern (car pattern) %temp - (lambda (x) ;temp is free in x + (lambda (x) ;temp is free in x (mapit (if (eq? %temp x) path ;+++ `(map (lambda (,%temp) ,x) @@ -207,11 +206,11 @@ (+ rank 1) env)) (gen (if (equal? (list x) vars) - x ;+++ + x ;+++ `(map (lambda ,vars ,x) ,@vars)))) (if (null? (cddr template)) - gen ;+++ + gen ;+++ `(append ,gen ,(process-template (cddr template) rank env))))))) ((pair? template) @@ -257,7 +256,7 @@ (#t ;;else free))) - c ;ignored + c ;ignored (display "HELLO") (newline)