For loop 基本Clojure语法

For loop 基本Clojure语法,for-loop,clojure,let,For Loop,Clojure,Let,假设我有一个宏,在宏中我有一个Let: let[ elements# //stuff// #newlist (for [e# elements#] (if (number? e#) (**add e# to #newlist**))) ] 由于我很难找到关于非常简单的Clojure内容的正确信息,我想问:我需要做什么来完成上述任务?我认为这应该是可能的,但我不知道最关键的部分 看起来您正在尝试创建一个名为newlist的列表,其中包含元素中的所有数字元素。如果是这样,您可以像

假设我有一个宏,在宏中我有一个Let:

let[
    elements# //stuff// 
    #newlist (for [e# elements#] (if (number? e#) (**add e# to #newlist**)))
]

由于我很难找到关于非常简单的Clojure内容的正确信息,我想问:我需要做什么来完成上述任务?我认为这应该是可能的,但我不知道最关键的部分

看起来您正在尝试创建一个名为
newlist
的列表,其中包含
元素
中的所有数字元素。如果是这样,您可以像这样使用
过滤器
功能:

(let
  [elements whatever
   newlist (filter number? elements)]
  do-stuff-with-newlist)
filter
接受一个谓词函数和一个列表,并返回一个新列表,其中包含谓词返回真实结果的项目


请注意,您最初在for循环中添加到列表的想法是行不通的,因为列表是不可变的,所以您不能就地添加到列表中。您可以在for循环中重新分配一个保存列表的变量(类似于
(set!my list(cons e my list))
,但这不是惯用的Clojure代码。它也会创建相反的列表。

它肯定适用于数字?因此,我从来没有提到任何东西,因为我假设该实例也适用,但它不适用。(filter(instance?java.something)元素)只是说明了一些事情“布尔值不能强制转换为clojuler.lang.IFn)@Deragon
过滤器的参数必须是函数,而不是调用函数的结果。”。因此,您应该创建一个单参数函数(命名或匿名),如果其参数是
java.something
的实例,则返回true,否则返回false。例如(filter#(instance?java.something%)元素)将起作用。