美文网首页
1.3 Formulating Abstractions wit

1.3 Formulating Abstractions wit

作者: Cloneable | 来源:发表于2022-08-03 17:05 被阅读0次

    lambda 表达式

    lambda 表达式与 define 作用类似,可以将表达式抽象为程式,不过无法命名,结构体如下

    (lambda (<formal-parameters>) <body>)
    

    lambda 表达式同样可以作为表达式的操作符使用,如下:

    ((lambda (x y z) (+ x y (sqaure z)))
       1 2 3)
    

    let 表达式

    let 用于定义局部变量,结构体如下:

    (let ((<var1> <exp1>)
          (<var2> <exp2>)
          ...
          (<varn> <expn>))
      <body>)
    

    其实 let 并不是一种表达式的特殊形式,而是基于 lambda 的语法糖,let 表达式的结构体转换为 lambda 形式如下:

    ((lambda (<var1> <var2> ... <varn>) 
       <body>)
      <exp1>
      <exp2>
      ...
      <expn>)
    

    let 定义的局部变量作用域为 let 表达式体中,于是衍生出下列两条规则:

    • let 仅允许被绑定的变量在此 let 表达式体中应用。例如,假设下列表达式中的 x 值为 5,整个表达式的结果为 38。因为在 let 体中应用的 x 值为 3,所以 let 表达式的结果为 33,而 let 表达式外部的 x 依然是 5,所以整个表达式的结果为 38。
    (+ (let ((x 3))
         (+ x (* x 10)))
       x)
    
    • let 中局部变量值的计算依靠 let 外部的变量。也就是说,let 中存在与表达式外部同名的变量,在计算 let 中局部变量结果时使用的依然是外部变量。例如,假设下列表达式中 x 的值是 2,整个表达式的结果为 12。因为 let 表达式中 x 值为 3,y 的值为 4(计算 y 时使用的 x 值为 let 外部的 x 值 2)。
    (let ((x 3)
          (y (+ x 2)))
      (* x y))
    

    高阶程式

    高阶程式是指维护通过参数传入的程式或返回结果为程式的程式,这种程式能够进行更高级别的抽象,为编程语言提供强大的表达能力。

    通常编程语言的第一公民拥有以下权限:

    • 能够命名为变量
    • 可以作为参数传递给程式
    • 可以作为程式的结果返回
    • 能够被包含在数据结构中

    加上高阶程式的表述,在 Lisp 中程式便是它的第一公民。

    相关文章

      网友评论

          本文标题:1.3 Formulating Abstractions wit

          本文链接:https://www.haomeiwen.com/subject/mfaywrtx.html