lisp - 如何在 Common Lisp 中使用 DO 宏编写 MEMBER 函数?

标签 lisp common-lisp

我正在尝试创建一个类似于 Common Lisp 中的 MEMBER 函数的函数。 所以,我想让这个功能像这样工作:

(my-member 2 '(1 4 5 5 3 2 5 6 9))
=> (2 5 6 9)

这与 MEMBER 函数的工作原理完全相同。;

(member 2 '(1 4 5 5 3 2 5 6 9))
=> (2 5 6 9)

条件是我应该使用“DO”宏来实现这个功能。 这是我为实现此功能而编写的代码:

(defun my-member (item x)
  "This function works like MEMBER function."
  (do ((z x (rest z))                
       (e (first x) (first z)))
      (:when (equal item (first z))      
             (return z)))) 

但是没用..

(my-member 2 '(3 4 5 2 1 1))
-> (3 4 5 2 1 1)

我应该怎么做才能解决这个问题?

最佳答案

下面是使用do的正确方法:

(do ((var 0 (1+ var))
     (lst '() (cons var lst)))
    ((= var 5) lst)))
; ==> (4 3 2 1 0)

所以 varlst 都是初始化为 0() 的变量,并且在每次迭代之后变量设置为 (1+ var)(cons var lst)

决定什么时候应该停止的是 (= var 5) 变成不为 nil 并且当这种情况发生时整个 do 形式的结果是 lst。这是 do 的第二部分,也是最后一部分,因为我没有提供正文。

您可以只使用一个变量和带有结束条件的第二部分以及 的结果应该是什么来制作 member function 的等价物做。祝你好运!

关于lisp - 如何在 Common Lisp 中使用 DO 宏编写 MEMBER 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43283408/

相关文章:

common-lisp - 什么时候在 lambda 表达式前使用#'(函数)?

macos - 如何为 OSX 设置 Common Lisp 开发环境? (编程新手)

common-lisp - 照应宏符号有一个来自不同包的前缀,我该如何摆脱它?

functional-programming - Common Lisp 中的 Eval

random - 一个 Common Lisp 程序错误

list - LISP 函数总是返回 nil

lisp - 普通口齿不清 :KEY parameter use

clojure - 如何将字符串放入列表

lisp - 修改函数的参数

lisp - 如何在ACL2中使用递归进行循环?