【问题标题】:basic Clojure syntax基本的 Clojure 语法
【发布时间】:2013-01-03 17:26:08
【问题描述】:

假设我有一个宏,在宏里面我有这个 let:

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

由于我很难找到关于非常简单的 Clojure 东西的正确信息,所以我在这里问:我需要做什么才能完成上述任务?我认为应该可以做到这一点,但我不知道最关键的部分!

【问题讨论】:

    标签: for-loop clojure let


    【解决方案1】:

    您似乎正在尝试创建一个名为newlist 的列表,其中包含elements 的所有数字元素。如果是这样,您可以像这样使用filter 函数:

    (let
      [elements whatever
       newlist (filter number? elements)]
      do-stuff-with-newlist)
    

    filter 接受一个谓词函数和一个列表,并返回一个新列表,其中包含谓词返回真实结果的那些项目。

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

    【讨论】:

    • 它绝对适用于数字?等等,我从来没有提到任何事情,因为我假设了那个例子?也可以,但事实并非如此。 (过滤器(实例?java.something)元素)只是说“布尔不能转换为clojurer.lang.IFn)
    • @Deragon filter 的参数必须是函数,而不是调用函数的结果。因此,您应该创建一个单参数函数(命名或匿名),如果其参数是 java.something 的实例,则返回 true,否则返回 false。
    • 例如 (filter #(instance?java.something %) 元素) 将起作用。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2019-03-17
    • 2012-11-09
    相关资源
    最近更新 更多