Для задания по функциональному программированию я пишу макрос схемы, который переводит код схемы в код 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 в синтаксис определения. Что я делаю неправильно?
let-syntax
здесь не имеет смысла. Вы можете сказать это, потому что(let-syntax ...)
имеет отступ на том же уровне, что и(if (list? ...) ...)
. - person dyoo   schedule 12.03.2012