目录
七,列表筛选 remove-if、remove-if-not
https://www.nhooo.com/tool/lisp/
本文中,“运行结果”指的都是lisp.jsrun的在线运行结果。
下载lispbox即可,官网下载太慢,从百度云下:
链接:https://blog.csdn.net/nameofcsdn/article/details/119086279
本文中,“得到”指的都是交互运行环境中得到的结果
(setf x (read))
这样就把读取到的内容赋给了x
(1)format
format有2个必须的参数,一个是输出位置,如 t 是标准输出,一个是输出内容
代码:
(format t "Hello, world!")
运行结果:Hello, world!
(2)print
(print "Hello, world!")
(3)write、write-line
(write "Hello, world!")
(write-line "Hello, world!")
(format t "~A " 10)
运行结果:10
(setf i 10)
(format t "i is: ~A " i)
运行结果:i is: 10
代码:
(defun outWorld()
(write-line "Hello, world!"))
(outWorld)
运行结果:Hello, world!
(defun myadd(a b)
(+ a b))
(print (myadd 2 3))
在形参列表前面加上&key,相当于传入的是符号而不是其值,所以用法上有2个差异:
一个是实参的顺序可以变,一个是参数有默认值NIL,可以缺省实参。
代码一:
(defun mylist (&key a b c)
(list a b c))
(mylist :a 1 :b 2 :c 3)
得到:(1 2 3)
代码二:
(mylist :b 2 :c 3 :a 1)
得到:(1 2 3)
代码三:
(mylist :b 4)
得到:(NIL 4 NIL)
代码四:
(mylist)
得到:(NIL NIL NIL)
(setf mylist '(1 2 3))
(print (nth 2 mylist))
运行结果:3
nth是取元素,下标从0开始
Lisp语言需要区分一个列表是数据还是代码,默认是代码,需要解引用才会被视为数据。
解引用的常见方式:
(setf mylist '(1 2 3))
(setf mylist (quote(1 2 3)))
(setf mylist (list :a 1 :b 2 :c 3))
(print (getf mylist :a))
属性表的用法和c++中的map差不多
代码:
(setf mylist '(1 2 A))
(print (nth 2 mylist))
运行结果:A
代码:
(setf mylist '(1 2 A))
(setq A "abcd")
(print (eval (nth 2 mylist)))
运行结果:"abcd"
代码:
(setf mylist '(1 2 A))
(setf B "abcd")
(setf A B)
(print (eval (nth 2 mylist)))
运行结果:"abcd"
(remove-if-not #'evenp '(1 2 3 4 5))
得到: (2 4)
其中evenp是判断一个数是不是偶数
(remove-if #'evenp '(1 2 3 4 5))
得到:(1 3 5)
(remove-if-not #'(lambda (x) (= 0 (mod x 2))) '(1 2 3 4 5))
其中的(lambda (x) (= 0 (mod x 2)))是一个lambda表达式,含义和evenp一样,判断一个数是不是偶数
(reverse '(1 2 3)
得到:(3 2 1)
(defmacro myreverse(x) (reverse x))
(myreverse ("abcd" t format))
运行结果:abcd