LISP 基础练习

本贴最后更新于 1878 天前,其中的信息可能已经物是人非

函数

说明

定义一个函数,接受两个实参,返回较大的那一个

要点

  • 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 使用的人实在太少了

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...