Before we apply a function we must first evaluate its arguments.
这一点常常是编程语言的神秘所在。在SICP的封面,EvalApply是被画作一个阴阳的图案。AlanKay说他可以在一页纸上写出最强大的编程语言,主要说的也是Eval和Apply。
如果你觉得简单就是美,你完全可以定义一个图灵完备的语言,仅仅通过一个数组和“减1,然后跳转”这点东西。但是我们的目标是做一个有用的语言。
SmallTalk是有用的,跟Kay想的差不多。Lisp也是一样。
当然,使用惰性求值,你可以在参数用到的时候才去计算他。
下面是著名的那一对了
可以用一句话来描述:表达式在环境中的求值被归约到过程对实际参数的应用,而这种应用又被归约到新的表达式在新的环境中求值,如此下去,直至我们下降到符号(其值可以在环境中找到)或者基本过程(我们可以直接应用)。
define eval(expr, environment):
if is_literal(expr): return literal_value(expr)
if is_symbol(expr): return lookup_symbol(expr, environment)
;; other similar cases here
;; remaining (and commonest) case: function application
function = extract_function(expr)
arguments = extract_arguments(expr)
apply(eval(function, environment), eval_list(arguments, environment))
define apply(function, arguments):
if is_primitive(function): return apply_primitive(function, arguments)
environment = augment(function_environment(function),
formal_args(function), arguments)
return eval(function_body(function), environment)
def eval_list(items, environment):
return map( { x -> eval(x, environment) }, items)
有一点比较有意思,上面的代码实现了词法作用域哦。
分享到:
相关推荐
6. **EVAL和APPLY**:这两个函数是LISP的核心,EVAL用于评估一个表达式,APPLY用于将一个函数应用于一组参数。 7. **REPL(Read-Eval-Print Loop)**:LISP环境通常提供一个交互式解释器,用户可以即时运行和测试...
8. **EVAL和APPLY**:`EVAL`函数用于评估一个S-表达式,而`APPLY`将函数应用于一组参数,这两个函数是LISP解释器的核心。 9. **迭代与循环**:虽然LISP最初以递归为主,但也有`DOTIMES`和`DO`等循环结构供选择。 ...
- **EVAL和APPLY**:这两个函数是LISP中的核心,EVAL用于执行S-表达式,APPLY用于调用函数并传递参数。 3. CAD二次开发环境: - AutoLISP:这是AutoCAD内置的LISP方言,提供了丰富的API接口,可以直接操作AutoCAD...
它的实现方式是利用`apply`方法将`handler`函数应用到`globals`对象上,并将按键值数组作为参数传递。这种方式可以避免直接使用`eval`函数带来的安全问题。 ##### 3. 安全性考虑 - **避免使用`eval`**:在传统的...
在AngularJS中,$parse和$eval是两个关键的服务,它们与AngularJS的表达式处理密切相关。理解这两个服务的工作原理对于深入掌握AngularJS的绑定机制至关重要。 首先,我们需要明确什么是AngularJS表达式。这些...
以下是 eval 函数的详细用法和说明: eval 函数的功能 eval 函数的主要功能是将一个字符串当作一个 JavaScript 表达式一样去执行它。它可以将一个字符串解释成 JavaScript 代码,然后执行它。这种功能使得 eval ...
在Web开发中,eval函数和Function构造器是执行动态JavaScript代码的两种主要方式。然而,这些功能也可能被用于反爬虫技术,即通过加密和动态执行来隐藏网站的真实内容,防止被爬虫程序抓取。为了绕过这些反爬虫措施...
此外,由于作用域问题和潜在的性能影响,推荐使用其他更安全、更可预测的替代方法,如`new Function()`或`Function.prototype.apply()`。在编写JavaScript代码时,尽量避免或限制对`eval()`的依赖,以保持代码的健壮...
自从我进入 Lisp,更具体地说是 Clojure,我就对 Lisp 的 eval/apply 函数着迷了。 这么小的东西怎么会有这么大的力量? 当然,我必须自己实现一个 Lisp 解释器。 通过这种方式,我希望能够理解为什么它如此强大。 ...
例如,使用`new Function()`构造函数或者`Function.prototype.apply()`和`Function.prototype.call()`方法。这些方法可以限制代码的执行范围,减少安全风险。 5. **性能问题**: `eval()`的另一个缺点是性能。由于...
这样的修复方案虽然能解决IE低版本不支持 `call` 和 `apply` 的问题,但它依赖于 `eval`,这可能会带来性能问题和安全风险。在现代浏览器环境中,通常不推荐使用 `eval`,因为它可以执行任意代码,可能引发注入攻击...
总的来说,`eval()`和`new Function()`可以作为JavaScript语法检查的临时解决方案,但它们都有其局限性和潜在风险。在实际开发中,更推荐使用专门的语法解析库或现代JavaScript特性,如`try...catch`语句,以及...
cl-poker-eval 纯普通的Lisp 7卡扑克手评估。 基于pokersource的评估。 可通过quicklisp加载。 * (ql:quickload " cl-poker-eval " ) cl-poker-eval对卡值使用以下枚举: ...(apply #'cl-poker-eval:eval-hand-var
在本文中,我们将深入探讨`eval()`函数在处理函数时的行为差异,特别是在JScript和SpiderMonkey这两个不同的JavaScript引擎中。 首先,我们需要理解JavaScript中的表达式和语句的区别。在JavaScript中,`eval()`...
该方法使用 `toString()` 和 `join()` 方法将数组转换为字符串,然后使用 `eval()` 方法来执行 `Math.max()` 和 `Math.min()` 方法。代码如下: ``` var ary = [54, 65, 43, 21, 12, 34, 45, 58, 97, 24]; var maxN ...
它们展示了如何利用程序作为数据的概念来构造和操纵代码,以及如何通过`eval`和`apply`来控制表达式的求值和函数的应用。通过这些问题和练习,学习者可以深入理解Scheme的这一特性,并提升他们的编程能力。
另外,避免使用eval()函数,因为eval()的执行涉及到代码的重新解析和编译,所以会比直接执行代码要慢。 在循环方面,JavaScript提供了for(;;),while()和for(in)三种循环方式。其中,for(in)循环遍历对象属性时效率...
5. **应用用户定义的函数**: 使用`eval`和`apply`函数将用户定义的函数应用于随机数`y`,结果赋值给变量`z`。 6. **输出结果**: 最后,输出所应用的函数、参数及其计算结果。 #### 4.2 分析与解释 - **`format`...