2013-04-14 5 views
0

Я изучаю, как работает макросистема в Scheme, и я пытаюсь сделать мой код более похожим на JavaScript-y. Поэтому я подумал, что начну с макроса function. Это, как я хочу, определение функции, чтобы посмотреть:Ошибка при расширении макроса в схеме курицы

(function id (x) x) 

Оно должно расширяться следующее:

(define (id x) x) 

Так я пишу макрос следующим образом:

(define-syntax function 
    (lambda (name args . body) 
     `(define (,name ,@args) ,@body))) 

Однако, когда я используйте его. Я получаю следующую ошибку (в схеме курицы):

Error: during expansion of (define ...) - in `define' - lambda-list expected: (define ((function id (x) x) . #<procedure (rename sym1348)>) #<procedure (compare s11400 s21401)>) 

    Call history: 

    <syntax>  (function id (x) x) 
    <eval> (##sys#cons (##core#quote define) (##sys#cons (##sys#cons name args) body)) 
    <eval> (##sys#cons (##sys#cons name args) body) 
    <eval> (##sys#cons name args) <-- 

Где я иду не так? Кроме того, как я могу прочитать такие сообщения об ошибках, чтобы иметь возможность самостоятельно отлаживать программу?

ответ

4

В схеме, с использованием синтаксических правил():

(define-syntax function 
    (syntax-rules() 
    ((function name (args ...) body ...) 
    (define (name args ...) body ...)))) 

Ошибка вы видите, что компилятор, по-видимому Chicken Scheme ожидает, что вторая форма define-syntax быть макро процедура расширения - они обычно требуют аргументы в пользу переименование и сравнение идентификаторов. lambda в вашем макросе не создает подходящую функцию - syntax-rules.

Вышесказанное гарантирует гигиеничность.

3

То, как вы определили макрос, неверно в соответствии с документацией курицы. Ваш код, похоже, более вдохновлен макросами Common Lisp. Проверьте документ here для define-syntax с функцией трансформатора:

макрос должен быть определен как:

(define-syntax function 
    (lambda (expr inject compare) 
     `(define (,(cadr expr) ,@(caddr expr)) ,(cadddr expr)))) 

выража всего макроса выражение т.е. (function id (x) x) и впрыснуть и сравнить специальные сервисные функции, передаваемые в макрос время макрос расширяется.

 Смежные вопросы

  • Нет связанных вопросов^_^