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

标签 lisp

定义带有两个参数的函数“映射”:一个简单列表 L 和一个整数值 val。列表 L 的每个元素都是一个包含两个原子的列表——键和对象。该函数返回键小于 val 的对象列表。

例子: (映射'((12 k) (7 n) (23 r) (9 p)) 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 语句没有返回我期望的所有值的列表。

最佳答案

使用高阶函数编写你想要的东西真的很容易,你不需要所有这些嵌套的 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)

关于lisp - 从另一个列表的原子在 LISP 中构建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26701423/

相关文章:

scheme - 方案中的递归宏导致意外循环

java - 在 clojure 中使用 java 结构

coding-style - Lisp Style 问题标签是否是局部函数?

vim - Slimv - 更改 REPL 垂直拆分

list - 获取列表的第一个和最后一个原子并附加它们

lisp - Lisp 和 Scheme 中的 WebSockets 库?

lisp - Vlisp autocad : condition (> a b) is true even when a is equal b. 为什么?

list - Lisp 4 行游戏

c - 启用宏的语言如何跟踪源代码以进行调试?

list - 在 Lisp 中用 defun 重写一个列表