gpt4 book ai didi

macros - 是否有用于从列表中弹出第 n 个元素的通用 lisp 宏?

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

我对 Common Lisp 场景很陌生,我似乎无法找到一种快速的方法来从列表中获取第 n 个元素并同时将其从所述列表中删除。我已经做到了,但它并不漂亮,我真正喜欢的是类似“pop”但需要第二个参数的东西:

(setf x '(a b c d))
(setf y (popnth 2 x))
; x is '(a b d)
; y is 'c

我很确定“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))))

最佳答案

像这样:

删除列表的第 n 个元素:

(defun remove-nth (list n)
(remove-if (constantly t) list :start n :end (1+ n)))

constantly返回一个函数,该函数始终返回其参数。

作为接受 place 的宏, 使用 define-modify-macro :

(define-modify-macro remove-nth-f (n) remove-nth "Remove the nth element")

POP-NTH

(defmacro pop-nth (list n)
(let ((n-var (gensym)))
`(let ((,n-var ,n))
(prog1 (nth ,n-var ,list)
(remove-nth-f ,list ,n-var)))))

示例:

CL-USER 26 > (defparameter *list* (list 1 2 3 4))
*LIST*

CL-USER 27 > (pop-nth *list* 0)
1

CL-USER 28 > *list*
(2 3 4)

CL-USER 29 > (pop-nth *list* 2)
4

CL-USER 30 > *list*
(2 3)

关于macros - 是否有用于从列表中弹出第 n 个元素的通用 lisp 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093845/

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