racket内置了丰富的list函数,这些函数有些是SRFI 1 标准里边的,有些则不是。 不过,不管出自哪里,都比autolisp、visual lisp的list函数丰富多了。

这些函数是十分有用又是十分常用的,对于autolisp这种只有list一种内置数据结构的编程语言来说, 尤其地有用。所以,用autolisp来实现这些函数就是十分必要的了。

接下来我就贴出来一些racket函数和SRFI 1 标准函数的autolisp实现。

drop 函数

drop函数接受2个参数,1个list和1个整数,返回去掉list左边n个元素之后的新list。

1
2
3
4
5
6
7
8
9
(defun drop (n lst / out) 
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (cond 
    ((null lst) nil)
    ((> 1 n) lst)
    (t
     (setq out lst)
     (repeat n 
       (setq out (cdr out))))))

drop-right 函数

drop-right函数接受2个参数,1个list和1个整数,返回去掉list右边n个元素之后的新list。

1
2
3
(defun drop-right (n lst) 
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (reverse (drop n (reverse lst))))

take 函数

take函数接受2个参数,1个list和1个整数,返回由list左边n个元素组成的新list。

1
2
3
4
5
(defun take (n lst) 
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (if (or (> 1 n) (null lst)) 
    nil
    (drop-right (- (length lst) n) lst)))

take-right 函数

take-right函数接受2个参数,1个list和1个整数,返回由list右边n个元素组成的新list。

1
2
3
(defun take-right (n lst)
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (drop (- (length lst) n) lst))

drop-while 函数

drop-while函数接受2个参数,1个判断函数和1个list,功能是去掉使用判断函数得到t值的元素, 从list左边开始执行直到碰到到判断函数结果为nil时停止。

这个函数在racket里边叫做dropfdrop-while是SRFI 标准里边采用的函数名称。

1
2
3
4
5
(defun drop-while (pred lst / out) 
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (setq out lst)
  (while (apply pred (list (car out))) 
    (setq out (cdr out))))

take-while 函数

take-while函数接受2个参数,1个判断函数和1个list,功能是提取使用判断函数得到t值的元素, 从list左边开始执行直到碰到到判断函数结果为nil时停止。

这个函数在racket里边叫做takeftake-while是SRFI 标准里边采用的函数名称。

1
2
3
4
5
6
7
(defun take-while (pred lst / y out) 
;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (setq y lst)
  (while (apply pred (list (car y))) 
    (setq out (cons (car y) out)
          y   (cdr y)))
  (reverse out))

一点体会

Racket很有意思,它有很多名字很长的内置函数,这个可能和它的教学语言的这个用途有关, 可是,在上面列出来的这个几个函数里边,Racket又偏偏选择了短得不能更短的名字, 这一点也不consistent,实在是十分令人遗憾。