gpt4 book ai didi

lisp - 在 Lisp 中一次定义 n 个函数

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

假设我想做以下事情:

(loop for i from 1 to n do
(defun ith(lst)
(nth i lst)))

显然我真正想做的是:

(defun 1th(lst)(nth 1 lst))
(defun 2th(lst)(nth 2 lst))
(defun 3th(lst)(nth 3 lst))
(defun 4th(lst)(nth 4 lst))
......
(defun 100th(lst)(nth 100 lst))

我该怎么做?

最佳答案

给你。请注意,|1th| 将返回第二个值:

(defmacro make-nths (n)
`(progn
,@(loop for i from 1 to n
collecting `(defun ,(intern (format nil "~ath" i)) (list)
(nth ,i list)))))

正如 Xach 在评论中指出的那样,macrolet 在这里可能更可取,因为您实际上并不需要全局定义的宏:

(macrolet ((make-nths (n)
`(progn
,@(loop for i from 1 to n
collect `(defun ,(intern (format nil "~ath" i)) (list)
(nth ,i list))))))
(make-nths 3)) ; choose n here

最后,这是 ninjaaa 的非宏解决方案的工作版本:

(loop for i from 1 to 3 ; choose n here
do (let ((i i)) ; introduce new bindings for each iteration
(setf (symbol-function (intern (format nil "~ath" i)))
(lambda (list) (nth i list)))))

关于lisp - 在 Lisp 中一次定义 n 个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7278843/

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