`
buluzhai
  • 浏览: 110169 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Eval和Apply

阅读更多
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)


有一点比较有意思,上面的代码实现了词法作用域哦。
分享到:
评论

相关推荐

    BDES.rar_lisp

    6. **EVAL和APPLY**:这两个函数是LISP的核心,EVAL用于评估一个表达式,APPLY用于将一个函数应用于一组参数。 7. **REPL(Read-Eval-Print Loop)**:LISP环境通常提供一个交互式解释器,用户可以即时运行和测试...

    收集整理超级有用的83个lisp源码.rar

    8. **EVAL和APPLY**:`EVAL`函数用于评估一个S-表达式,而`APPLY`将函数应用于一组参数,这两个函数是LISP解释器的核心。 9. **迭代与循环**:虽然LISP最初以递归为主,但也有`DOTIMES`和`DO`等循环结构供选择。 ...

    几个小CAD二次开发LISP程序

    - **EVAL和APPLY**:这两个函数是LISP中的核心,EVAL用于执行S-表达式,APPLY用于调用函数并传递参数。 3. CAD二次开发环境: - AutoLISP:这是AutoCAD内置的LISP方言,提供了丰富的API接口,可以直接操作AutoCAD...

    JS键盘监听事件addkey无eval版

    它的实现方式是利用`apply`方法将`handler`函数应用到`globals`对象上,并将按键值数组作为参数传递。这种方式可以避免直接使用`eval`函数带来的安全问题。 ##### 3. 安全性考虑 - **避免使用`eval`**:在传统的...

    说说AngularJS中的$parse和$eval的用法

    在AngularJS中,$parse和$eval是两个关键的服务,它们与AngularJS的表达式处理密切相关。理解这两个服务的工作原理对于深入掌握AngularJS的绑定机制至关重要。 首先,我们需要明确什么是AngularJS表达式。这些...

    Javascript中eval函数的详细用法与说明

    以下是 eval 函数的详细用法和说明: eval 函数的功能 eval 函数的主要功能是将一个字符串当作一个 JavaScript 表达式一样去执行它。它可以将一个字符串解释成 JavaScript 代码,然后执行它。这种功能使得 eval ...

    JS中注入eval, Function等系统函数截获动态代码

    在Web开发中,eval函数和Function构造器是执行动态JavaScript代码的两种主要方式。然而,这些功能也可能被用于反爬虫技术,即通过加密和动态执行来隐藏网站的真实内容,防止被爬虫程序抓取。为了绕过这些反爬虫措施...

    JavaScript中eval()函数用法详解

    此外,由于作用域问题和潜在的性能影响,推荐使用其他更安全、更可预测的替代方法,如`new Function()`或`Function.prototype.apply()`。在编写JavaScript代码时,尽量避免或限制对`eval()`的依赖,以保持代码的健壮...

    mylisp:我的 Lisp 语言

    自从我进入 Lisp,更具体地说是 Clojure,我就对 Lisp 的 eval/apply 函数着迷了。 这么小的东西怎么会有这么大的力量? 当然,我必须自己实现一个 Lisp 解释器。 通过这种方式,我希望能够理解为什么它如此强大。 ...

    了解一点js的Eval函数

    例如,使用`new Function()`构造函数或者`Function.prototype.apply()`和`Function.prototype.call()`方法。这些方法可以限制代码的执行范围,减少安全风险。 5. **性能问题**: `eval()`的另一个缺点是性能。由于...

    完美解决IE低版本不支持call与apply的问题

    这样的修复方案虽然能解决IE低版本不支持 `call` 和 `apply` 的问题,但它依赖于 `eval`,这可能会带来性能问题和安全风险。在现代浏览器环境中,通常不推荐使用 `eval`,因为它可以执行任意代码,可能引发注入攻击...

    javascript使用eval或者new Function进行语法检查

    总的来说,`eval()`和`new Function()`可以作为JavaScript语法检查的临时解决方案,但它们都有其局限性和潜在风险。在实际开发中,更推荐使用专门的语法解析库或现代JavaScript特性,如`try...catch`语句,以及...

    cl-poker-eval:常见的Lisp 7卡扑克手评估。 基于扑克资源的评估

    cl-poker-eval 纯普通的Lisp 7卡扑克手评估。 基于pokersource的评估。 可通过quicklisp加载。 * (ql:quickload " cl-poker-eval " ) cl-poker-eval对卡值使用以下枚举: ...(apply #'cl-poker-eval:eval-hand-var

    对JavaScript的eval()中使用函数的进一步讨论

    在本文中,我们将深入探讨`eval()`函数在处理函数时的行为差异,特别是在JScript和SpiderMonkey这两个不同的JavaScript引擎中。 首先,我们需要理解JavaScript中的表达式和语句的区别。在JavaScript中,`eval()`...

    求js数组的最大值和最小值的四种方法.docx

    该方法使用 `toString()` 和 `join()` 方法将数组转换为字符串,然后使用 `eval()` 方法来执行 `Math.max()` 和 `Math.min()` 方法。代码如下: ``` var ary = [54, 65, 43, 21, 12, 34, 45, 58, 97, 24]; var maxN ...

    disc12.pdf

    它们展示了如何利用程序作为数据的概念来构造和操纵代码,以及如何通过`eval`和`apply`来控制表达式的求值和函数的应用。通过这些问题和练习,学习者可以深入理解Scheme的这一特性,并提升他们的编程能力。

    使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧

    另外,避免使用eval()函数,因为eval()的执行涉及到代码的重新解析和编译,所以会比直接执行代码要慢。 在循环方面,JavaScript提供了for(;;),while()和for(in)三种循环方式。其中,for(in)循环遍历对象属性时效率...

    一个类似于grep功能的lisp程序

    5. **应用用户定义的函数**: 使用`eval`和`apply`函数将用户定义的函数应用于随机数`y`,结果赋值给变量`z`。 6. **输出结果**: 最后,输出所应用的函数、参数及其计算结果。 #### 4.2 分析与解释 - **`format`...

Global site tag (gtag.js) - Google Analytics