У меня есть макрос, который я написал в 2010 году, он был для управления структурами, как в Common Lips, с использованием списков (вот весь файл, включая функции https://jcubic.pl/struct.txt).
(define-macro (defstruct name . fields)
"Macro implementing structures in guile based on assoc list."
(let ((names (map (lambda (symbol) (gensym)) fields))
(struct (gensym))
(field-arg (gensym)))
`(if (not (every-unique ',fields))
(error 'defstruct "Fields must be unique")
(begin
(define (,(make-name name) ,@names)
(map cons ',fields (list ,@names)))
,@(map (lambda (field)
`(define (,(make-getter name field) ,struct)
(cdr (assq ',field ,struct)))) fields)
,@(map (lambda (field)
`(define (,(make-setter name field) ,struct ,field-arg)
(assq-set! ,struct ',field ,field-arg)
,field-arg)) fields)
(define (,(make-predicate name) ,struct)
(and (struct? ,struct)
(let ((result #t))
(for-each (lambda (x y)
(if (not (eq? x y)) (set! result #f)))
',fields
(map car ,struct))
result)))))))
Он работал нормально. Недавно я обновил этот макрос для своего LIPS в JavaScript (он основан на схеме), и когда я его вызываю , он возвращал false
и хотел знать, как это будет работать хитростью. Но оказывается, что это совсем не хитрость. Он показывает эту ошибку:
При компиляции выражения: ОШИБКА: синтаксическая ошибка: неизвестное местоположение: определение в контексте выражения, где определения не разрешены, в форме (define (make-point # {g746} # # {g747} #) (map cons (quote (xy) ) (список # {g746} # # {g747} #))
Почему у меня эта ошибка и как ее исправить, чтобы она снова работала хитроумно? Я был давно, я не помню, как я тестировал этот код, но открытие хитрости с помощью функции загрузки или копирование и вставка кода в интерпретатор все дают ту же ошибку.
Я использую хитрость 2.0.14 в GNU / Linux.
PS: Я предпочитаю использовать макросы lisp. IMO они превосходят гигиенические макросы со странной схемой.