lisp入门

基本

(+ 2 5)     ;返回7
'(+ 2 5)    ;返回(+ 2 5)
(list 1 2 3);   ;;列出1 2 3
'(1 2 3)  ;同上

(car '(a b c));     ;;列出集合中第一个元素
(first '(a b c));   ;; 同上
(cdr '(1 2 3));     ;; 列出第一个元素外剩余的元素
(rest '(1 2 3));    ;;同上

(cons 'lions '(tigers bears));      ;;用来把lions元素和(tigers bears)合并成一个list
(list 'lions 'tigers 'bears 'zzzz); ;;用来把元素合并成一个list
(append '(lions zzz) '(tigers bears) '(ccc));       ;;把元素合并成list

(cons '2 nil);  ;; nil是空,2与空合并,还是2
(nthcdr 2 '(pine fir oak maple));   ;;重复执行rest 2 次
(nth 1 '("one" "two" "three"));     ;;重复执行first 2 次.

(setq animals '(antelope giraffe lion tiger));
(setcar animals 'zzzz);               ;;setcar更改list中第一个元素

(setq animals '(antelope giraffe lion tiger));
(setcdr animals '(111 222));          ;;setcdr更改list中的rest部分

;; 循环
(setq animals '(gazelle giraffe lion tiger zzz));
(defun print-elements-of-list (list)
  (while list
    (print (first list))
    (setq list (rest list))
  )
);
(print-elements-of-list animals);

;; 给变量赋值
(set 'flowers '(rose violet daisy buttercup));      ;; 把集合赋给flowers这个变量
(setq flowers '(rose violet daisy buttercup));      ;; 把集合赋给flowers这个变量

(if (> 2 5) 0 1);    ;;若2>5,则返回0,否则返回1

;;s表达式上面的所有例子中括号套括号的表达式就叫s表达式

函数

defun 是用于定义自定义函数的函数。第一个参数是函数名,第二个参数是参数列表,第三个参数是希望执行的代码

实例:

(defun my\_second (lst) (first (rest lst)));
运行:
(my_second '(1 2 3));

(defun my\_max (x y) (if (> x y) x y));
运行:
(my_max 2 5); 返回5

递归

lisp语言最适合于递归,下面的例子用递归实现集合之和:

(defun total (x)  (if (null x)    0    (+ (first x) (total (rest x)))  ));
(total '(1 2 3));
;; 返回6

高阶函数(lambda表达式)

((lambda (a b) (+ a b)) 101 102);
;;返回101+102=203
((lambda (arg) (+ arg 1)) 5);
;;返回5+1 = 6

(setf total '(lambda (a b) (+ a b)));
(total '(101 102));
;;返回101+102=203

(defmacro times_two (x) (* 2 x));
(times_two 2);
;;返回4

(defmacro sum (x y) (+ x y));
(sum 2 5);
;;返回7

数据可当作代码执行