【问题标题】:Anonymous function returning 1 using #()匿名函数使用 #() 返回 1
【发布时间】:2019-07-16 02:59:41
【问题描述】:

使用 defn 或 fn 很容易创建一个函数,该函数接受一个忽略它并返回 1 的参数:

(defn ret1 [arg] 1)
(fn [arg] 1)

可以用#() 宏来做到这一点吗?我不是说使用丑陋或“作弊”之类的东西

#(/ % %)  or 
#(if (nil? %) 1 1)

我的意思是直接忽略参数并返回 1。我找不到有效的干净语法。

【问题讨论】:

  • 这行得通 - 越来越近了.. #(last (list % 1))

标签: clojure


【解决方案1】:

#(do %& 1) ... 但(constantly 1) 更好。

【讨论】:

  • 啊哈!是的,这比我上次使用#(last(list)) 的尝试更干净。我还喜欢您使用 %& 将其推广到任意数量的参数。最初的问题受到 SICP 1.37 的启发,它规定使用 (lambda (i) 1.0) 返回 1.0。与 clojure 的明显映射是 (fn [i] 1),但我想知道如何使用 #() 来实现。谢谢!
【解决方案2】:

#() 语法不能用于按照您的描述要求创建具有未使用参数的函数。这是 #() 阅读器宏的限制。

我建议不要使用#(),而只写(恒定为1),这是创建忽略参数并始终返回1的函数的一种非常简单的方法。

【讨论】:

  • #() 语法不能用于创建具有未使用参数的函数当然可以(见我的回答),但这不是最好的方法。跨度>
  • @drcode 请承认答案是错误的。像你一样,我从来没有想过插入一个流浪的%& 来调用任意参数列表。
  • @drcode ...与否?有争议的是,即使没有评估它们,提及参数也构成使用。但正如问题所要求的,它们肯定会被忽略
  • @Thumbnail:特此让大家知道,关于我 4 年前给出的一个答案,我承认自己错了,对“忽略”和“丑陋”这两个词规定了某些特定的解释。跨度>
  • @drcode LOL ... 我会提请注意任何无用地使用拆分不定式的人。
【解决方案3】:

#(identity 1) 怎么样?与#(do %& 1)(constantly 1) 做同样的事情。

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2011-11-05
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多