ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#### **表达式的构成** 表达式是autolisp的基本构成单元,每个autolisp程序都是由一个或多个表达式构成。其基本形式是: > (函数名 参数 ) ***左括号 函数名 一个或多个参数 右括号*** 其中每个参数都可以是另一个表达式。 每个表达是都会返回一个值,这个值又可以作为上一级函数的参数 表达式的计算顺序是从里到外,从左到右 例子: `(+ 1 2)` 结果是 3 `(+ 2 (* 3 7))` 结果是23。先计算 (* 3 7),得到结果21,再计算(+ 2 21),得到结果23 #### **表达式求值规则** 1、如果当前位置的类型是列表,则进入状态2;如果是原子(符号或字面量),则进入状态4. 2、将列表的第一项作为函数名,其余项作为参数,进行函数求值。函数求值进入状态3 3、如果函数名这一项合法,则对其余各项按从左到右的顺序依次应用状态1,将每项的返回值最为参数,执行函数调用;如果函数名不合法,则错误退出。 4、如果是符号,返回符号的值;如果是字面量,返回这个字面量本身。 对状态3,有几个函数是例外 defun - 执行时不对函数名之后的项求值 setq - 不对要赋值的项求值 举例: 1、 ``` (setq a 9 b "string") ``` 执行过程是: 状态1 -》状态2 -》状态3:对9求值 -》状态4:返回9-》状态3:对"string"求值-》状态4:返回"string"-》状态3:执行函数调用: 函数名setq 参数 a 9 b "string" 2、 ``` (* (+ 1 2) 5) ``` 执行过程: 状态1 -》状态2 -》状态3:对(+ 1 2)求值 -》状态1.1-》状态2.1-》状态3.1:对1求值-》状态4:返回1-》状态3.1:对2求值-》状态4:返回2-》状态3.1:执行函数调用 函数名+ 参数 1 2,结果是3,将结果返回-》状态3:对5求值-》状态4:返回5-》状态3:执行函数调用 函数名* 参数 3 5,结果15 3、`(set a 5)` 执行过程: 状态1 -》状态2 -》状态3:对a求值 -》状态4:返回nil-》状态3:对5求值-》状态4:返回5-》状态3:执行函数调用,函数名 set 参数 nil 5,由于nil不是合法的符号,错误返回。