LISP术语
* 原子
lisp中原子的概念为不可再分的数据类型,如数值,字符串,符号(这里的符号仅指符号本身,不指符号指向的值,符号的值可以是数值、字符串和表等)
autolisp中其它的非列表的数据类型,也可以称为原子,如 图元ename ,选择集 pickset,对象 vla-object 等。
函数 atom 可以测试一个符号指向的值是否为原子。
思考以下atom 的返回值分别是什么。可以带着这些问题继续学习。
(setq a nil)(atom a)
(atom 'a)
(setq a 5)(atom a)
(setq a '(5))(atom a)
 
* 符号,symbol
符号(Symbols)就是一串字符。你可以在符号中包含字母、数字、连接符等等。
 
这些组成符号的单位不能有 “(双引号) 、’(单引号) 。因为 ” 是用于表示字符串的, ’ 是用 lisp 中 操作符 quote 的简写。
 
如果你只输入数字,LISP会认为你输入了一个整数而不是符号。符号不分大小写 , abc 和 Abc 、 ABC .被认为是同一个符号。
* 自解析符号
对符号进行求值,其值就是符号本身,这种符号称为自解析符号。
常用的如 t nil :vlax-true :vlax-false
以及其它的以 : 开头的符号。
 
* nil
有两个比较特别的符号就是 t 跟 nil 。
 
nil 即是原子,也是链表。NIL 是没有包含任何元素的链表。
我们可以理解为古代道家的思想,混沌、无极。无中生有(生出t),无极生太极,(t 和 nil)。
 
* t
t 这个符号所定义的值就是 t ,而 nil 这个符号所定义的值就是 nil 。
 
Lisp 把 t 跟 nil 这两个值拿来表示“真”与“假”。
 
像 t 和 nil 这样的符号被称为自解析符号,因为他们解析为自身。
 
* 点对
点对 (cons) 就是一个有两个部分组成的数据单元。由于一些历史上的因素,这两个部分分别称作 “car” 跟 “cdr” 。
 
我们可以使用 cons 函数加 两个参数 构造出一个点对。两个参数作为由一个点作为分界前后部分。
 
也可理解为 点对 是 一个阴阳球,由 阴 (前面)和阳(后面)两部分组成。 car 取出 阴, cdr 取出阳。
 
car cdr 取出的 阴 或 阳 ,也是因 阴阳球组成的,可以一直分下去。直到不可分为止。 这个不可分,在lisp 中叫 原子 (atom) .
 
这个数据单元是组成表的基本单位。
 
* 链表
利用点对(Cons)我们可以创造出很多结构,而当中最简单的就是链表(linked list)。链表就是把 Cons 的 CAR 指定成某些元素,而把 CDR 指定到另一个 Cons 或是 NIL 。
如下,我们可以经由 list 函数来创造链表。
(list 4 5 6) ;; 结果为 (4 5 6)
(cons 4 (cons 5 (cons 6 nil))) ;; 结果相上。
看到上面的例子,应该有注意到 Lisp 在打印链表的时候,会有一些原则:它输出的时候会省略掉一些 . 连结点对的点,以及 () 括号。
而省略的原则如下,如果这个点对的 CDR 是 NIL 的话,那这个 NIL 跟它前面的连结点将不会被印出来;如果这个点对 A 的 CDR 是另外一个点对 B 的话,那在点对 B 前面的连结点以及点对 B 本身的小括号都不会被印出来。
 
比如说,包含两个元素的链表(a b)中,cdr是(b),一个含有单个元素的链表;包含一个元素的链表(b),cdr是nil,故此这里必然是一个没有元素的链表。
 
nil 的 car 跟 cdr 都定义成 nil。 (从 空 里 取出的依然是 空)
 
* 表达式
表达式相当于 C 语言中的一条条语句
 
一个最简单的 Lisp 表达式是整数。如果我们在提示符后面输入 1 ,
> 1
1
系统会打印出它的值,接着打印出另一个提示符,告诉你它在等待更多的输入。
 
在这个情况里,打印的值与输入的值相同。数字 1 称之为对自身求值。
 
当我们输入需要做某些计算来求值的表达式时,生活变得更加有趣了。举例来说,如果我们想把两个数相加,我们输入像是:
 
> (+ 2 3)
5
在表达式 (+ 2 3) 里, + 称为操作符,而数字 2 跟 3 称为实参。
 
在日常生活中,我们会把表达式写作 2 + 3 ,但在 Lisp 里,我们把 + 操作符写在前面,接著写实参,再把整个表达式用一对括号包起来: (+ 2 3) 。
 
这称为 前序表达式 。一开始可能觉得这样写表达式有点怪,但事实上这种表示法是 Lisp 最美妙的东西之一。
 
举例来说,我们想把三个数加起来,用日常生活的表示法,要写两次 + 号,
 
2 + 3 + 4
 
而在 Lisp 里,只需要增加一个实参:
 
(+ 2 3 4)
由于操作符可接受不定数量的实参,我们需要用括号来标明表达式的开始与结束。
 
表达式可以嵌套。即表达式里的实参,可以是另一个复杂的表达式:
 
> (/ (- 7 1) (- 4 2))
 
3
上面的表达式用中文来说是, (七减一) 除以 (四减二) 。
Lisp 表示法另一个美丽的地方是:它就是如此简单。所有的 Lisp 表达式,要么是 1 这样的数, 原子,要么是包在括号里,由零个或多个表达式所构成的列表。以下是合法的 Lisp 表达式:
 
2
(+ 2 3)
(+ 2 3 4)
(/ (- 7 1) (- 4 2))
稍后我们将理解到,所有的 Lisp 程序都采用这种形式。而像是 C 这种语言,有着更复杂的语法:算术表达式采用中序表示法;函数调用采用某种前序表示法,实参用逗号隔开;表达式用分号隔开;而一段程序用大括号隔开。
 
在 Lisp 里,我们用单一的表示法,来表达所有的概念。
 
在 lisp 中,表达式所表示一切,定义函数是写表达式,各种操作都是写表达式,编程,开发都是在写表达式。
 
* 求值
当一段表达式被 lisp 解释器读入的时候,解释器就会对这段表达式求值,求值就相当于运行程序。
 
可以使用 eval 函数对一个表达式进行求值。
 
就像当小学生看见一个 数学公式 时,就要对它进行计算一样。
 
所以 lisp 程序的运行过程,就是这些表达式集合的求值过程.
 
表达式能被求值的前提条件是 表达式列表的第一个符号必须是函数。
 
如下
(函数 参数 参数 (函数 参数 (函数 .....)))
 
紧跟 括号的第一个符号必须是函数。
 
如果表达式是一个符号,那么求值就返回符号的值。
 
如果表达式是一个数值或字符串,求值就是返回这个数值或字符串本身。
 
* 函数式编程
‌‌函数式编程(Functional Programming, FP)是一种编程范式,它将计算机运算视为数学上的函数计算,强调避免使用程序状态和易变对象‌。‌
 
** 函数式编程的核心特点包括:
‌- 没有副作用‌:函数内部不与外部互动,不修改全局变量的值,保持独立性。
‌- 引用透明性‌:函数的输出只依赖于输入,不依赖于系统的状态,这使得程序的行为可以形式化推断。
‌- 函数作为一等公民‌:函数可以作为参数传递,作为返回值返回,也可以赋值给变量。
- ‌只用表达式,不用语句‌:表达式有返回值,而语句没有,这保持了计算的纯粹性。
 
** 函数式编程的优势包括:
- ‌代码简洁易懂‌:避免了复杂的控制流程和数据状态变化,使得代码更加简洁易懂。
- ‌高代码可重用性‌:由于函数的模块化,相同的函数可以在不同的场景和上下文中重复使用。
- ‌高代码可维护性‌:避免了数据状态的变化和副作用,使得代码更容易维护和调试。
 
* MVC
Model-View-Controller(MVC)是一种软件架构模式,是软件设计模式的体现,用于组织代码并分离关注点,广泛应用于用户界面的开发中。
该模式将相关程序逻辑划分为三个相互关联的组成部分:模型、视图和控制器 [10]。MVC 模式最初用于桌面图形用户界面(Graph User Interface,GUI),但后来因设计 Web 应用程序而变得流行。
许多流行的编程语言都有 MVC 框架,这些框架促进了 MVC 模式的实现。
进行 DCL 开发中. dcl 文件相当于 MVC中的 View。回调action 相当于Controller.
2024-09-30
浏览49
登录后评论
评论
分享