macros - eval 宏未绑定(bind)变量(CHICKEN 方案)

标签 macros scheme eval chicken-scheme

我正在尝试评估一个列表,该列表包含一个宏函数中的变量,该宏函数在 lambda 中定义了一个变量,但其中的 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 但出现了同样的错误

最佳答案

我建议您尝试:

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

在此之后你的输出应该是

(list P Q)

为什么这样做? 在 Scheme 中,代码是使用括号嵌套的。

所以,例如

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

Scheme 将尝试找到 1 的定义并将 2 和 3 作为参数传递。

鉴于

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

将打印

(list 1 2 3)

简而言之,单引号就像一个转义字符。

关于macros - eval 宏未绑定(bind)变量(CHICKEN 方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602955/

相关文章:

C 预处理器宏扩展

macros - 在 Clojure 中,我们什么时候应该使用 monad 而不是宏,反之亦然?

c++ - 在 Visual Studio 中使用整个项目或解决方案的参数定义预处理器宏的选项

c++ - 在 printf 中使用可以扩展为整数或无值的 MACROS

scheme - .vimrc 中 Scheme 的条件选项

node.js - Node : How to set the file name for eval?

events - Racket:在框架%窗口中使用事件

lisp - 语法错误(标识符后有多个表达式)

php - 有没有一种方法可以将对各种 PHP 函数的调用存储在 MySQL 数据库中,而不会有使用 eval() 的风险?

perl - 为什么 Perl 的 Try::Tiny 的 try/catch 没有给出与 eval 相同的结果?