以下为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)
符号(Symbols)就是一串字符。你可以在符号中包含字母、数字、连接符等等。
这些组成符号的单位不能有 “(双引号) 、’(单引号) 。因为 ” 是用于表示字符串的, ’ 是用 lisp 中 操作符 quote 的简写。
如果你只输入数字,LISP会认为你输入了一个整数而不是符号。符号不分大小写 , abc 和 Abc 、 ABC .被认为是同一个符号。
对符号进行求值,其值就是符号本身,这种符号称为自解析符号。 在 autolisp 中,如 :vlax-true :vlax-false :vlax-null 以及:vlr-* 系列为自解析符号,在编程时不能用数值代替。
在visuallisp中,当dump 一个对象时,:vlax-true 可能会显示 为 -1。但是在lisp代码中,不能用-1代替 :vlax-true 。这与autolisp中定义的以 ac开头的常量值不同。需注意区分。
在用户环境中,我们自己定义的以:开头的符号不遵守这个约定。如(setq :abc 5) ,:abc 不是自解析符号。
有两个比较特别的符号就是 t 跟 nil 。
nil 即是原子,也是链表。NIL 是没有包含任何元素的链表。 我们可以理解为古代道家的思想,混沌、无极。无中生有(生出t),无极生太极,(t 和 nil)。
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。 (从 空 里 取出的依然是 空)
alisp本质上是一个列表,其每个元素本身都是一个点对单元。 如 ((a . 1)(b . 2)(c . 3)) 或 ((a 1)(b 2)(c 3)) 后面这个本质是((a . (1))(b . (2))(c . (3)))
表达式相当于 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 程序的运行过程,就是这些表达式集合的求值过程.
表达式能被求值的前提条件是 表达式列表的第一个符号必须是函数。
如下 (函数 参数 参数 (函数 参数 (函数 …..)))
紧跟 括号的第一个符号必须是函数。
如果表达式是一个符号,那么求值就返回符号的值。
如果表达式是一个数值或字符串,求值就是返回这个数值或字符串本身。
顺序结构是最基本的编程结构,它按照代码的书写顺序,从上到下依次执行。没有使用任何控制流程语句,如if、for、while等。顺序结构通常用于执行一系列不需要条件判断或循环的简单操作。 如
(setq a 5)
(setq b (+ a 2))
(setq c (+ a b))
选择结构允许程序根据条件选择不同的执行路径。 if cond 函数根据条件是否为真来决定是否执行特定的代码块,用于在满足特定条件时执行一段代码。
(if (> a 5)(princ a))
(if (> a 5)
(princ "Y")
(princ "N")
)
多分支可以用if嵌套实现,也可以用cond函数。
(cond
((> 0 a)
(princ "a < 0"))
((<= 0 a 10)
(princ "a [0, 10]"))
((<= 10.01 a 20)
(princ "a (10, 20]"))
)
循环结构允许程序重复执行一段代码,直到满足某个条件。 autolisp 中可以用 while foreach repeat 实现。 mapcar 函数可以实现对列表中的每个元素操作,某种意义上也算循环操作。
函数式编程(Functional Programming, FP)是一种编程范式,它将计算机运算视为数学上的函数计算,强调避免使用程序状态和易变对象。
Model-View-Controller(MVC)是一种软件架构模式,是软件设计模式的体现,用于组织代码并分离关注点,广泛应用于用户界面的开发中。 该模式将相关程序逻辑划分为三个相互关联的组成部分:模型、视图和控制器 [10]。MVC 模式最初用于桌面图形用户界面(Graph User Interface,GUI),但后来因设计 Web 应用程序而变得流行。 许多流行的编程语言都有 MVC 框架,这些框架促进了 MVC 模式的实现。 进行 DCL 开发中. dcl 文件相当于 MVC中的 View。回调action 相当于Controller.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。