2016-07-25 5 views
-1

Я пытаюсь написать let over lambda defmacro/g! в схеме хитрости. У меня есть следующее:Как расширить макросы в схеме хитрости?

(use-modules (srfi srfi-1)) 

(define (flatten x) 
    (let rec ((x x) (acc '())) 
     (cond ((null? x) acc) 
       ((not (pair? x)) (cons x acc)) 
       (else 
       (rec (car x) 
        (rec (cdr x) acc)))))) 

(define (g!-symbol? s) 
    (and (symbol? s) 
     (let ((symbol-string (symbol->string s))) 
     (and (> (string-length symbol-string) 2) 
       (equal? (string-downcase (substring symbol-string 0 2)) "g!"))))) 


(define-macro (define-macro/g! name-args . body) 
    (let ((syms (delete-duplicates 
       (filter g!-symbol? (flatten body))))) 
    `(define-macro ,name-args 
     (let ,(map 
       (lambda (s) 
        `(,s (gensym ,(substring (symbol->string s) 2)))) 
       syms) 
      ,@body)))) 

но когда я пытаюсь макросложить define-macro/g! с помощью этого:

(use-modules (language tree-il)) 
(tree-il->scheme (macroexpand '(define-macro/g! (foo . body) `(let ((g!car ,(car body))) g!car)))) 

Я получил это:

$15 = (if #f #f) 

почему я получил этот результат? Как я могу расширить define-macro/g!?

+0

Я не очень понимаю, что вы пытаетесь достичь. Вы хотите отфильтровать список аргументов? Вы уверены, что 'синтаксис-правила' не то, что вы хотите? –

ответ

0

мне нужно использовать этот код:

(define macro '(define-macro/g! (foo . body) `(let ((g!car ,(car body))) g!car))) 
(tree-il->scheme (macroexpand macro 'c '(compile load eval)))