在LISP中从另一个列表的原子构建一个List

时间:2014-11-02 16:12:36

标签: lisp

定义功能'映射'它有两个参数:一个SIMPLE列表L和一个整数值val。列表L的每个元素都是两个原子的列表 - 键和对象。该函数返回键小于val的对象列表。

实施例: (映射'((12k)(7n)(23r)(9p))13) - > (k n p)

我的代码:

(defun mapping (list val)
    (if (consp list)  ;;if list is not empty
        (if (> val (caar list)) ;; check the first value in the first nested list
            (cons (car(cdr list)));;if value is greater add that value to the return list

    (mapping (cdr list) val)))) ;; recurse thru the list

我的代码有语法错误以及cons语句没有返回我期望的所有值的列表。

1 个答案:

答案 0 :(得分:0)

使用高阶函数编写你想要的东西真的很容易,你不需要所有这些嵌套的IF。

(defun mapping (list val)
  (mapcan
    (lambda (el)
      (if (> val (car el))
        (cdr el)
        nil))
    list))

CL-USER> (mapping '((12 k) (7 n) (23 r) (9 p)) 13)
(K N P)

如果你必须重复一次递归:

(defun recursive-mapping (list val)
  (cond
    ((null list) nil)
    ((> val (caar list)) (cons (cadar list)
                               (recursive-mapping (cdr list) val)))
    (t (recursive-mapping (cdr list) val))))

CL-USER> (recursive-mapping '((12 k) (7 n) (23 r) (9 p)) 20)
(K N P)