схема лукавства: пусть синтаксис неверный?

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

В настоящее время я пытаюсь вложить let-syntax в 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 в синтаксис определения. Что я делаю неправильно?


person cali-spc    schedule 11.03.2012    source источник
comment
Чего вы пытаетесь достичь? Какой результат вы ожидали от своего образца?   -  person Chris Jester-Young    schedule 11.03.2012
comment
(coffee (define (xy) (+ xy)) должен преобразовать оператор определения из схемы в эквивалентный coffeescript. Хотя этот конкретный пример довольно бессмысленный. Если у меня правильный синтаксис, вывод должен быть: x = (y) - › х + у   -  person cali-spc    schedule 12.03.2012
comment
let-синтаксис похож на let в том смысле, что он ограничен телом. Но ваше использование let-syntax здесь не имеет смысла. Вы можете сказать это, потому что (let-syntax ...) имеет отступ на том же уровне, что и (if (list? ...) ...).   -  person dyoo    schedule 12.03.2012


Ответы (1)


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

 (let-syntax <bindings> <body>) 

Синтаксис: должен иметь вид

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

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

person Justin Ethier    schedule 14.03.2012
comment
Спасибо - в итоге я использовал совершенно другой подход к решению своей задачи, но то, что вы и dyoo сказали, все же помогло. - person cali-spc; 19.03.2012