Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何通过;应用功能“;作为公共Lisp中的参数_Clojure_Lisp_Common Lisp - Fatal编程技术网

Clojure 如何通过;应用功能“;作为公共Lisp中的参数

Clojure 如何通过;应用功能“;作为公共Lisp中的参数,clojure,lisp,common-lisp,Clojure,Lisp,Common Lisp,我不熟悉Common Lisp,正在尝试从Clojure反复实现。比如说 (重复5#(rand int 11)) 这将收集5个(rand int 11)呼叫,并返回一个列表: (101302) 目前,我正在做的就是: (重复地取消(n f args) (从1到n的x循环 收集(应用f参数))) 这看起来不太好,我不得不这样称呼它:(重复5#“random”(11))。有没有办法让函数更直观,就像Clojure的语法一样 代码可能会变得非常难看:(重复5#函数(list(-x1)) 我不确定我

我不熟悉Common Lisp,正在尝试从Clojure反复实现
。比如说

(重复5#(rand int 11))
这将收集5个(rand int 11)呼叫,并返回一个列表:
(101302)

目前,我正在做的就是:

(重复地取消(n f args)
(从1到n的x循环
收集(应用f参数)))
这看起来不太好,我不得不这样称呼它:
(重复5#“random”(11))
。有没有办法让函数更直观,就像Clojure的语法一样

代码可能会变得非常难看:
(重复5#函数(list(-x1))


我不确定我是否正确理解了你的问题,但可能是这样的:

(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)

虽然Daniels的回答很完美,但我想指出关于CL的一件很酷的事情。您可以实现与Clojure类似的reader宏。既然
#(1 2 3)
是CL中的数组文字,我将用
[…]
#(…)
特性实现
[…]

(设置宏字符)#\[
(lambda(流字符)
(声明(忽略字符))
(let((正文(读分隔列表\35;\]stream t)))
`(lambda(&可选的%1%2%3%4%5&aux(%1)),body)))
(设置宏字符#\]
(获取宏字符#\))
我没有花时间搜索
%s
,因此它不是最佳的。以下是一些例子:

(mapcar[sqrt(+(*%1%1)(*%2%2))”(1 3 5)“2 4 6”)
; ==> (2.236068 5 7.81025)
(地图车[*2]'(2 4 6))
; ==> (4 8 12)
(重复5[rand int 11])
; ==> (10 1 3 0 2)

Rest参数

你也可以把它写成

(defun repeatedly (n f &rest args)
  (loop repeat n collect (apply f args)))
因此,不需要自己创建参数列表

然后我们称之为:

> (repeatedly 5 #'random (1- x))
(7 2 3 1 4)
而不是
(重复5#'随机(列表(1-x))

通过宏的较短符号

出于某些目的,短lambda符号也可以通过宏实现:

> (defun repeatedly (n function)
    (loop repeat n collect (funcall function)))
REPEATEDLY

> (repeatedly 5 (lambda () (random 10)))
(1 7 1 7 8)

> (defmacro ⧨ (&body body) `(lambda () ,@body))
⧨

> (repeatedly 5 (⧨ (random 10)))
(9 3 0 7 0)

or alternatively:

> (defmacro ⧩ (&body body) `(lambda () ,body))
⧩

> (repeatedly 5 (⧩ random 10))
(9 7 7 7 5)
风格

通常,将语言结构编写为读取器宏也是不必要的,也不可取的。s表达式的扩展最好放在编程语言级别之下->s表达式主要是数据语法


在大多数Lisp代码中,实际上可以找到没有任何缩写的
lambda
表达式。通常的Lisp风格是使用符号名,而不是太多的特殊字符或特殊的词汇/标记语法。它使文本稍长,但还有其他优点。例如,在文本和已读或甚至正在运行的代码中可以看到相同的
lambda

谢谢,您理解,这就是我想要的。因此,使它紧凑的是Clojure所具有的语法优势,但使用lambda确实比我所做的更清晰。@PedroQueiroga请参阅现有的匿名函数的较短语法(但请记住Rainer Joswig的警告)