当前位置: 首页 > 工具软件 > Mod_lisp > 使用案例 >

Lisp语言入门

方航
2023-12-01

目录

一,运行环境

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.com/tool/lisp/

http://lisp.jsrun.net/

本文中,“运行结果”指的都是lisp.jsrun的在线运行结果。

2,本地交互运行环境

下载lispbox即可,官网下载太慢,从百度云下:

链接:https://blog.csdn.net/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

 类似资料: