Racket “的定义是什么?”;顶级表格“;吵闹

Racket “的定义是什么?”;顶级表格“;吵闹,racket,Racket,球拍参考第11.9节“扩展顶级表格”和第13.2节“评估和汇编”使用术语“顶级表格”,参考手册中的功能说明(评估顶级表格[nm])和(扩展顶级表格)将“顶级表格”作为其功能参数,但我不清楚“顶级表单”的定义。术语“顶级形式”在Racket语言中的含义是什么?这里的直觉是,这些函数都处理“顶级形式”,而不是依赖于词汇环境的形式。作为一个半明显的例子,eval只能处理顶级表单,这就是为什么: (let ([x 10]) (eval '(* 3 x))) 不起作用。“表单”的通常用法是指任何表单

球拍参考第11.9节“扩展顶级表格”和第13.2节“评估和汇编”使用术语“顶级表格”,参考手册中的功能说明(评估顶级表格[nm])(扩展顶级表格)将“顶级表格”作为其功能参数,但我不清楚“顶级表单”的定义。术语“顶级形式”在Racket语言中的含义是什么?

这里的直觉是,这些函数都处理“顶级形式”,而不是依赖于词汇环境的形式。作为一个半明显的例子,
eval
只能处理顶级表单,这就是为什么:

(let ([x 10])
  (eval '(* 3 x)))

不起作用。“表单”的通常用法是指任何表单,例如宏的输入——当然可以有这样的引用。

我现在在《球拍参考手册》第1.2.3.1节中找到了一种巴克斯·诺尔格式的顶级表单的精确定义


)

我不清楚为什么这不起作用:(定义x10)(定义ns(生成基本命名空间))(eval'(*3 x)ns),但这起作用:(定义(andlist lst)(定义ns(生成基本命名空间))(eval(cons'和lst)ns))这是两个独立的问题。在第一个示例中,您在当前全局名称空间中定义
x
,然后将
ns
创建为一个新的名称空间,它显然没有这样的绑定。在第二个例子中,你在评估一些与
lst
无关的东西,相反,你只是在评估一些使用
lst
的值作为语法的东西,这不太可能是你想要的。还有更多的注释:(a)如果你试图
一个列表,那么这些解决方案就不能很好地工作了——看看
和map
函数;(b) 如果你真的想做这样的事情,那么你应该学习宏,而不是试图让
eval
去做它们;(c) 如果你真的想使用
eval
,那么一定要阅读相关内容。谢谢Eli,是的,作为一个练习,来学习一些关于Racket的知识。我正在尝试制作一个函数,该函数将在表达式列表上进行适当的短路,并执行“and”。我想不出如何使用andmap。我唯一能弄明白怎么做的方法是使用我在上一篇评论中写下的函数,它将引用的表达式列表作为参数,构造一个“and”语句并对其进行评估。我很确定这不是一种好的球拍风格。谢谢你的名字空间。虽然我有更多的阅读要做,但现在它更清楚了。在这种情况下,我要做最后一点说明:对于学习如何使用语言的这种情况,这种方法可能更有效。