【SCIP】[todo]Primitive elements, combination, abstraction

对于了解所有的语言,首先要了解

  1. Primitive elements 基本元素
  2. Means of combination 如何把这些基本元素组合在一起,组合在一起之后的含义是什么,构建出来更大的对象是什么
  3. Means of abstraction 如何利用基本元素进行封装,如何做使得它们可以像基本元素一样使用,以逐渐构建复杂的东西

Primitive elements & Means of combination

Combination 组合式 格式: (+ 3 17.4 5)

  • operator 运算符
  • operands 运算对象

Lisp 的括号不同于数学的括号

  • 数学中的括号用于分组,有些时候可以省略,多加也只会使得分组更明确
  • Lisp 的括号总是意味着所括之物是另一个组合式,在 apply operators to operands,不能多了也不能少了
❌ (* (5) A)
SchemeError: Cannot call 5

Current Eval Stack:
-------------------------
0: (5)
1: (* (5) A)
❌ * (5) A
PrimitiveProcedure
SchemeError: Cannot call 5

Current Eval Stack:
-------------------------
0: (5)
SchemeError: unknown identifier: A

Current Eval Stack:
-------------------------
0: A
1: (5)

Lisp 的 combination 实际上是一棵将二维结构写作线性字符串的语法树

在线运行 Lisp 地址:https://inst.eecs.berkeley.edu/~cs61a/fa14/assets/interpreter/scheme.html

3
(+ (* 3 5)
   (* 47
      (- 20 6.8))
   12)
3
647.4

Means of abstraction

抽象化一些组合式并给它命名,使得可以将其作为一个元素

不带参数的组合式:

(DEFINE A(+ 5 5))
(* A A)
(DEFINE B(+ A(* 5 A)))

带参数的组合式:

(DEFINE (SQUARE X)(* X X))

用 lambda 方式命名带参数的组合式,对 lisp 来说和上面的没区别,只是 syntactic sugar:

(DEFINE SQUARE
    (LAMBDA (X) (* X X)))

带参数过程的使用:

(SQUARE 1001)
(+ (SQUARE 3) (SQUARE 4))
(SQUARE (SQUARE (SQUARE 1001)))

我们无法分辨内建元素(things are built in)与复合元素(things are compound)的区别,因为复合元素经过了一层抽象封装(abstraction wrapper)

Conditional 的过程:

(DEFINE (ABS X)
    (COND (< X 0)))

你可能感兴趣的:(SICP,SICP)