函数
说明
定义一个函数,接受两个实参,返回较大的那一个
要点
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 使用的人实在太少了
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于