相关疑难解决方法(0)

是否有一个常见的lisp宏用于从列表中弹出第n个元素?

我对Common Lisp场景很新鲜,我似乎无法找到一个快速的方法从列表中获取第n个元素并同时从列表中删除它.我已经完成了,但它并不漂亮,我真正喜欢的是像"pop"这样的东西,但又采用了第二个参数:

(setf x '(a b c d))
(setf y (popnth 2 x))
; x is '(a b d)
; y is 'c
Run Code Online (Sandbox Code Playgroud)

我很确定"popnth"必须是一个宏,以防参数为0并且它必须表现得像"pop".

编辑:这是我的垃圾第一版:

(defmacro popnth (n lst)
  (let ((tempvar (gensym)))
    `(if (eql ,n 0)
      (pop ,lst)
      (let ((,tempvar (nth ,n ,lst)))
        (setf (cdr (nthcdr ,(- n 1) ,lst)) (nthcdr ,(+ n 1) ,lst))
        ,tempvar))))
Run Code Online (Sandbox Code Playgroud)

lisp macros common-lisp

5
推荐指数
3
解决办法
2554
查看次数

标签 统计

common-lisp ×1

lisp ×1

macros ×1