2015-06-20 67 views
3

返回的数据类型如下表达作品 -从FN字面

((fn[n][(take n (range))]) 10) 

虽然低于抛出一个错误 -

(#([(take % (range))]) 10) 

为什么不能我只是从字面函数返回一个数据类型?

+1

我没有访问计算机,但宏展开fn文字,你会看到不同之处。 –

回答

3

#(do [1 2]) 

由于@Mars表示您也可以使用vector函数的替代方法。

#(vector 1 2) 
4

#匿名函数宏扩展为fn形式,例如,

#([1 2]) 

扩展为(fn* [] ([1 2]))

,你可以看到,当这个叫,你试图返回向量将被作为函数调用,因为没有提供参数,这将失败。这是你有同样的问题:如果你绝对要使用的#读者宏观只是使用do匿名函数返回的“数据”

#([(take % (range))]) 

扩展为

(fn* [x] ([(take x (range))])) 
+0

那么我怎么写一个函数文字,我只想返回一个矢量? – murtaza52

+1

@ murtaza52 - 你想将从'take'返回的序列转换成矢量吗?你可以使用'#(vec(带%(range)))'。如果你想返回一个包含序列的向量,我想你需要使用'fn'形式。 – Lee

+1

在'#()'函数中使用'vector'而不是'[']'作为外部表达式。 – Mars