gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:18 25 4
gpt4 key购买 nike

我正在尝试创建一个类似于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com