【问题标题】:How can I write a MEMBER function using the DO macro in Common Lisp?如何使用 Common Lisp 中的 DO 宏编写 MEMBER 函数?
【发布时间】:2017-04-07 16:52:50
【问题描述】:

我正在尝试制作一个类似于 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)

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

【问题讨论】:

  • MEMBER 不是 Lisp 中的宏。
  • :when 是什么?
  • 糟糕,对不起。 MEMBER 是 Lisp 的内置函数!
  • 一个调试器建议我使用它。如果我不把分号和'when'放在一起,就会出现一些问题。
  • 哪里in the documentationend-test-form 需要以:whenwhen 为前缀?你确定这是 Common Lisp 吗?

标签: lisp common-lisp


【解决方案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) 变为不为零,而当这种情况发生时,整个do 表单的结果是lst。这是do 的第二部分,也是最后一个,因为我没有提供正文。

您可以只使用一个变量和带有结束条件的第二部分以及do 的结果应该是member 函数 的等效项。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多