我是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)

09-30 19:49