Макрос eval Несвязанная переменная (схема CHICKEN) - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь вывести список с переменными внутри макрофункции, которая определяет переменную в лямбда-выражении, но eval в ней не может

(define-syntax MYVAR
    (syntax-rules ()
        [(_ varname value body ...) ((lambda (varname) body ...) value)]))

(define mylist '(list P Q))
(print mylist)
(MYVAR P 1 
    (MYVAR Q 2
        (print P Q) ;;everything prints fine in here
        (print (eval mylist))))


<eval>    ((lambda2127 (P) (MYVAR Q 2 (print P Q) (print (eval mylist)))) 1)
<eval>    ((lambda2129 (Q) (print P Q) (print (eval mylist))) 2)
<eval>    (print P Q)
<eval>    (print (eval mylist))
<eval>    (eval mylist)
<syntax>      (list P Q)
<eval>    (list P Q)    <--

=> Error: unbound variable: P

Я предполагаю, что eval пытается вычислить перед моим макросомкомпилирует, но не уверен,

есть ли способ повторно использовать список и оценивать его внутри макроса?

Я пытался использовать define-for-syntax, но возникает та же ошибка

1 Ответ

0 голосов
/ 12 февраля 2019

Я бы порекомендовал вам попробовать:

(MYVAR P 1
    (MYVAR Q 2
        ((print (eval 'mylist)))))

После этого ваш вывод должен быть

(list P Q)

Почему это сработало?В схеме код вложен в круглые скобки.

Так, например,

(print (eval (list 1 2 3)))

Схема попытается найти определение 1 и передать 2 и 3 в качестве аргументов.

Принимая во внимание,

(print (eval '(list 1 2 3)))

Напечатает

(list 1 2 3)

Короче говоря, одинарная кавычка похожа на escape-символ.

...