目录
一,运行环境
1,在线运行环境
2,本地交互运行环境
二,输入输出
1,输入
2,输出
三,变量
1,格式化输出
2,变量赋值 setf
四,函数
1,无参函数
2,带参函数
3,关键字形参
五,列表
1,表list、按下标取元素nth
2,解引用quote
3,属性表plist、按key取元素getf
六,引用表达式求值eval
七,列表筛选 remove-if、remove-if-not
八,lambda表达式
九,宏
1,reverse反转列表
2,宏
一,运行环境
1,在线运行环境
https://www.nhooo/tool/lisp/
http://lisp.jsrun/
本文中,“运行结果”指的都是lisp.jsrun的在线运行结果。
2,本地交互运行环境
下载lispbox即可,官网下载太慢,从百度云下:
链接:https://blog.csdn/nameofcsdn/article/details/119086279
本文中,“得到”指的都是交互运行环境中得到的结果
二,输入输出
1,输入
(setf x (read))
这样就把读取到的内容赋给了x
2,输出
(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!")
三,变量
1,格式化输出
(format t "~A " 10)
运行结果:10
2,变量赋值 setf
(setf i 10)
(format t "i is: ~A " i)
运行结果:i is: 10
四,函数
1,无参函数
代码:
(defun outWorld()
(write-line "Hello, world!"))
(outWorld)
运行结果:Hello, world!
2,带参函数
(defun myadd(a b)
(+ a b))
(print (myadd 2 3))
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)
五,列表
1,表list、按下标取元素nth
(setf mylist '(1 2 3))
(print (nth 2 mylist))
运行结果:3
nth是取元素,下标从0开始
2,解引用quote
Lisp语言需要区分一个列表是数据还是代码,默认是代码,需要解引用才会被视为数据。
解引用的常见方式:
(setf mylist '(1 2 3))
(setf mylist (quote(1 2 3)))
3,属性表plist、按key取元素getf
(setf mylist (list :a 1 :b 2 :c 3))
(print (getf mylist :a))
属性表的用法和c++中的map差不多
六,引用表达式求值eval
代码:
(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、remove-if-not
(remove-if-not #'evenp '(1 2 3 4 5))
得到: (2 4)
其中evenp是判断一个数是不是偶数
(remove-if #'evenp '(1 2 3 4 5))
得到:(1 3 5)
八,lambda表达式
(remove-if-not #'(lambda (x) (= 0 (mod x 2))) '(1 2 3 4 5))
其中的(lambda (x) (= 0 (mod x 2)))是一个lambda表达式,含义和evenp一样,判断一个数是不是偶数
九,宏
1,reverse反转列表
(reverse '(1 2 3)
得到:(3 2 1)
2,宏
(defmacro myreverse(x) (reverse x))
(myreverse ("abcd" t format))
运行结果:abcd
更多推荐
Lisp语言入门
发布评论