8 Star 16 Fork 6

@lisp CAD应用云/@lisp 文档

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
术语.org 9.87 KB
一键复制 编辑 原始数据 按行查看 历史
VitalGG 提交于 2024-12-01 15:57 +08:00 . 修订20241201

术语,编程概念

以下为lisp基本术语。

  • 原子
  • 符号
  • 自解析符号
  • nil
  • t
  • 点对
  • 链表
  • 表达式
  • 求值

原子

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 .被认为是同一个符号。

自解析符号

对符号进行求值,其值就是符号本身,这种符号称为自解析符号。 在 autolisp 中,如 :vlax-true :vlax-false :vlax-null 以及:vlr-* 系列为自解析符号,在编程时不能用数值代替。

在visuallisp中,当dump 一个对象时,:vlax-true 可能会显示 为 -1。但是在lisp代码中,不能用-1代替 :vlax-true 。这与autolisp中定义的以 ac开头的常量值不同。需注意区分。

在用户环境中,我们自己定义的以:开头的符号不遵守这个约定。如(setq :abc 5) ,:abc 不是自解析符号。

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。 (从 空 里 取出的依然是 空)

alist,关联表

alisp本质上是一个列表,其每个元素本身都是一个点对单元。 如 ((a . 1)(b . 2)(c . 3)) 或 ((a 1)(b 2)(c 3)) 后面这个本质是((a . (1))(b . (2))(c . (3)))

表达式,S-表达式

表达式相当于 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)是一种编程范式,它将计算机运算视为数学上的函数计算,强调避免使用程序状态和易变对象。

函数式编程的核心特点包括:

  • 没有副作用:函数内部不与外部互动,不修改全局变量的值,保持独立性。
  • 引用透明性:函数的输出只依赖于输入,不依赖于系统的状态,这使得程序的行为可以形式化推断。
  • 函数作为一等公民:函数可以作为参数传递,作为返回值返回,也可以赋值给变量。
  • 只用表达式,不用语句:表达式有返回值,而语句没有,这保持了计算的纯粹性。

函数式编程的优势包括:

  • 代码简洁易懂:避免了复杂的控制流程和数据状态变化,使得代码更加简洁易懂。
  • 高代码可重用性:由于函数的模块化,相同的函数可以在不同的场景和上下文中重复使用。
  • 高代码可维护性:避免了数据状态的变化和副作用,使得代码更容易维护和调试。

MVC

Model-View-Controller(MVC)是一种软件架构模式,是软件设计模式的体现,用于组织代码并分离关注点,广泛应用于用户界面的开发中。 该模式将相关程序逻辑划分为三个相互关联的组成部分:模型、视图和控制器 [10]。MVC 模式最初用于桌面图形用户界面(Graph User Interface,GUI),但后来因设计 Web 应用程序而变得流行。 许多流行的编程语言都有 MVC 框架,这些框架促进了 MVC 模式的实现。 进行 DCL 开发中. dcl 文件相当于 MVC中的 View。回调action 相当于Controller.

Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Lisp
1
https://gitee.com/atlisp/atlisp-docs.git
git@gitee.com:atlisp/atlisp-docs.git
atlisp
atlisp-docs
@lisp 文档
main

搜索帮助