Схема на Guile: дай синтаксис недействительным? - PullRequest
2 голосов
/ 11 марта 2012

Для функционального программирования я пишу макрос схемы, который переводит код схемы в код coffeescript.Я использую guile в Linux Mint 12 и имею (use-syntax (syn-ice-9 syncase)) active.

В настоящее время я пытаюсь вложить let-синтаксис в define-syntax и получаю неожиданноеОшибка «неверный синтаксис».Пожалуйста, извините за любые плохие привычки программирования, поскольку я новичок в схеме.:)

Мой код:

(define-syntax coffee
  (syntax-rules (define lambda)
    ; translate define function
    ((_ (define arg1 arg2)) 
     (begin
       (let-syntax ((temp
                     (syntax-rules ()
                       ((_) (quote-replace-list 'arg1 'arg2))))))
       (if (list? 'arg1) 
           (string-append (coffee (car 'arg1)) " = " 
                          (comma-splice (cdr 'arg1)) " -> " 
                          (coffee temp))
           (string-append (coffee 'arg1) " = " 
                          (coffee arg2)))))))

и мой вывод:

guile> (load "hw2-retry.scm")
guile> (coffee (define (x y) (+ x y)))
ERROR: invalid syntax (let-syntax ((temp (syntax-rules () ((_)
(quote-replace-list (quote #) (quote #)))))))
ABORT: (misc-error)

После нескольких попыток исследовать эту ошибку, я начинаю думать, что япросто не понимая что-то фундаментальное.Я был уверен, что вы можете вложить let-синтаксис в define-синтаксис.Что я делаю не так?

1 Ответ

1 голос
/ 14 марта 2012

Из Схемы R 5 Спецификация RS , let-syntax имеет следующий синтаксис:

 (let-syntax <bindings> <body>) 

Синтаксис: должен иметь форму

((<keyword> <transformer spec>) ...)

Проблема с let-syntax в вашем коде (или, по крайней мере, одна из проблем) заключается в том, что if должен быть заключен в часть тела, как упоминал dyoo. Другими словами, вы должны сделать отступ в if, удалить закрывающую скобку в конце строки 8 и добавить закрывающую скобку в конце строки 14.

...