Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/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
Syntax Clojure/Lisp宏可以用来实现这个lambda语法吗?_Syntax_Clojure_Macros_Lambda_Nested Function - Fatal编程技术网

Syntax Clojure/Lisp宏可以用来实现这个lambda语法吗?

Syntax Clojure/Lisp宏可以用来实现这个lambda语法吗?,syntax,clojure,macros,lambda,nested-function,Syntax,Clojure,Macros,Lambda,Nested Function,在JavaScript中,与以下内容相同: ((#(%a %b') {a:1 b:2}) {a:3 b:4}) -> (1 4) 因此,换句话说,lambdas的简短语法(与Clojure当前的实现不同)允许嵌套函数。匿名读取器宏#()语法不允许嵌套匿名函数,因为不清楚给定参数%2对应的函数。人们已经提出了解决邮件列表中模糊性的方法,并且一致认为(fn[arg]…)表单足够简短和清晰,可以在大多数情况下使用;在某些情况下,嵌套的%2解析可能不够清晰或简洁 (function(x){ re

在JavaScript中,与以下内容相同:

((#(%a %b') {a:1 b:2}) {a:3 b:4}) -> (1 4)

因此,换句话说,lambdas的简短语法(与Clojure当前的实现不同)允许嵌套函数。

匿名读取器宏
#()
语法不允许嵌套匿名函数,因为不清楚给定参数
%2
对应的函数。人们已经提出了解决邮件列表中模糊性的方法,并且一致认为
(fn[arg]…)
表单足够简短和清晰,可以在大多数情况下使用;在某些情况下,嵌套的
%2
解析可能不够清晰或简洁

(function(x){ return function(y){ return [x.a,y.b]; }})({a:1,b:2})({a:3,b:4});
Output: [1,4]
可以写成

(function(x){ return function(y){ return [x.a,y.b]; }})

由于Clojure故意不支持用户定义的读卡器宏,因此很难添加您自己的读卡器宏来允许嵌套函数。

如果您只想使用没有任何宏的直接Clojure代码(即相当于JavaScript版本),那么您只需要:

(fn [x] (fn [y] [(.x a) (.y b)]))
如果您为实际宏标识符选择了除
#()
以外的其他形式,也可以使用宏执行此操作,例如,您可以执行以下操作:

(((fn [x] (fn [y] (list (:a x) (:b y)))) {:a 1 :b 2}) {:a 3 :b 4}) 
=> (1 4)
(顺便说一句,我修正了原始问题中的地图关键词,
a:1
不起作用……)

方法是:

  • 创建一个名为
    my lambda
  • 让此宏检查传递的符号,并将其转换为针对自动生成符号的关键字查找
  • 使用自动生成符号的函数的输出代码,如:
    (fn[sym1](fn[sym2](列表(:a sym1)(:b sym2)))
这种方法可以很好地处理嵌套函数。使用Clojure lambdas需要知道的重要一点是,
(fn[…])
可以嵌套,但
#(…)
不能嵌套(否则会导致函数参数的歧义)

您不能直接重写
#()
语法,因为Clojure还不支持读卡器宏。事实上,我认为这是一件好事——允许任意重新定义语法可能会导致一些人编写无法维护的代码,但没有明显的好处(在我看来,节省一些键入字符,但降低可读性/代码理解能力不是一个好处)


我想我在Clojure代码中看到的任何地方都知道它是一个常规的匿名函数,不必担心有人重新定义它来做一些奇怪的事情。

至于Clojure 1.4,Clojure支持用户定义的读卡器宏,您可以使用它来定义自己的lambda语法。但是,它们不允许您劫持
#()
语法。获取详细信息。

我不确定我是否正确理解了这个问题(尽管我已经给出了最好的猜测)。您可以添加一些示例输入和输出来澄清吗?我不知道clojure示例语法是关于什么的。你能解释一下吗。。比如,#(%a%b')的计算结果是什么?哦,那太糟糕了。我可以问一下,那个“邮件列表”是什么吗?我看不出实施起来有多么困难;只需为嵌套变量添加一个标记。编辑:需要一个链接到那个提案会很难吗?官方的Clojure用户组:添加阅读器宏的问题已经出现太多次了,我无法推荐任何有用的线程。
(((my-lambda %a %b) {:a 1 :b 2}) {:a 3 :b 4}) 
=> (1 4)