我是Common Lisp的新手,正在尝试实现Clojure中的arepeatedly
例如
(repeatedly 5 #(rand-int 11))
这将收集5个(rand int 11)电话,并返回一个列表:
(10 1 3 0 2)
目前,我正在做的是:
(defun repeatedly (n f args)
(loop for x from 1 to n
collect (apply f args)))
看起来不太好,我不得不这样称呼它:
(repeatedly 5 #'random '(11))
。有没有办法像Clojure的语法那样使函数更直观?代码会变得非常难看:
(repeatedly 5 #'function (list (- x 1)))
。https://clojuredocs.org/clojure.core/repeatedly
最佳答案
我不确定我是否正确理解了你的问题,但也许只是这样:
(defun repeatedly (n function)
(loop repeat n collect (funcall function)))
因为
#(…)
只是Clojure中lambdas的简写。CL-USER> (repeatedly 5 (lambda () (random 11)))
(0 8 3 6 2)
但这一点要短一点:
CL-USER> (loop repeat 5 collect (random 11))
(5 4 6 2 3)