
函数
说明
定义一个函数,接受两个实参,返回较大的那一个
要点
defun
关键字定义函数,后面跟函数名称,参数列表,函数体and
关键字表示与逻辑,后面可以跟多个条件表达式,如果所有表达式的值都不为 nil,返回最后一个表达式的值
代码
;;; 获取两个数字中大的那一个,若x与y中的任何一个不为数字则返回nil (defun bigger-number (x y) (and (typep x 'number) (and (typep y 'number) (and (> x y) x y ) ) ) ) (let ( (num1 2) (num2 1) ) (format t "The bigger number of ~A and ~A is: ~A ~%" num1 num2 (bigger-number num1 num2)) ) ; 期望值:2
迭代
说明
定义一个函数,接受一个列表作为实参,返回列表的第四个元素
要点
do
语句用来迭代,接受三个参数:
- 第一实参为一组变量说明:(一个符号 该符号的初始值 每次循环对该符号的操作)
- 第二个实参为循环终止条件,可以是多个表达式,若满足条件,中断循环并对所有表达式求职并返回最后一个表达式的值
- 第三个实参为循环体,可以是任意数量的表达式
;;; 获取列表的第四个元素,若列表长度小于4,则返回nil ;; l 目标列表 (defun get-forth-element (l) (do ((i 0 (+ i 1))) ((> i 2) (car l)) (setf l (cdr l)) ) ) (format t "~A" (get-forth-element '(a b 1 2))) ; 期望值:2
类型
说明
定义一个函数,接受一个列表作为实参,判断该列表中是否有类型为列表的元素
要点
- 使用
typep
判断类型,接受两个实参
第一个实参是需要判断的目标
第二个实参是期望的类型 - 使用递归
;;; 判断列表l中是否有类型为列表的元素 (defun lst-has-lst-element (l) (and (not (null l)) (or (typep (car l) 'list) (lst-has-lst-element (cdr l)) ) ) ) (let ( (l1 '(a b c d) (l2 '(1 2 (1 2))) ) ) (format t "List ~A has list element: ~A" l (lst-has-lst-element l)) (format t "List ~A has list element: ~A" l (lst-has-lst-element l)) ) ; 期望值: ; List (A B C D) has list element: nil ; List (1 2 (1 2)) has list element: T
结论
- lisp 中只有表达式,必须使用
()
包裹表达式 - lisp 中运算都是前缀表示法
- 学习 lisp 的过程中会对以前的编程思想造成一些颠覆
- lisp 语言高亮貌似不支持,阅读体验可能不太好,可能是 lisp 使用的人实在太少了
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于