ruby - 在 Ruby 中获得 Lisp 风格加法 (+ *args) 的最简单方法是什么?

标签 ruby lisp

所以我真的很喜欢 Lisp 中的这种语法:

 (+ 1 1 2 3 5 8 13)
 => 33

我想在 Ruby 中添加一个项目列表,并希望尽可能接近它。 现在,我最好的解决方案涉及数组和 collect/map 方法。

所以:

sum = 0; [1,1,2,3,5,8,13].collect { |n| sum += n }

但是...

我想为此添加可以返回 nil 的方法。

sum = 0; [1, booking_fee, 8,13].collect { |n| n = 0 if n.nil?; sum += n }

这样做真的很好,中间的所有行都引用可能返回 nil 的方法,但我不能以这种方式完全构建数组。这只是我希望我的语法看起来像什么的想法。

def total
  Array.new do
    booking_fee
    rental_charges
    internationalization_charges
    discounts
    wild_nights
  end.collect { |n| n = 0 if n.nil?; sum += n }
end

在我尝试破解和实现 Greenspun 规则之前有什么建议吗? (编程确实是一种强制症。

最佳答案

我真的不明白你的问题。如果你想要一个像 Lisp 中的 + 那样工作的方法,即接受任意数量的参数并且位于前缀位置而不是中缀,那是微不足道的:

def plus(*nums)
  nums.inject(:+)
end

plus 1, 1, 2, 3, 5, 8, 13 # => 33

如果你想得到真正的花哨,你可以覆盖 Array 的一元前缀 + 运算符:

class Array
  def +@
    inject(:+)
  end
end

+[1, 1, 2, 3, 5, 8, 13] # => 33

请不要那样做!

我看不出你的问题的其余部分与 Lisp 风格的加法运算有什么关系。

如果你想从 Array 中删除 nil,可以使用 Array#compact

关于ruby - 在 Ruby 中获得 Lisp 风格加法 (+ *args) 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330421/

相关文章:

ruby - Ruby 中的方法名有什么限制?

opengl - 在 FreeBSD 上安装 lisp/opengl

lisp - 如何查看 lisp (sbcl) 中函数的定义?

ruby-on-rails - 在 JSON JBuilder 中呈现 html 部分

ruby-on-rails - 在生产环境中执行由 gem 创建的 cron 时缺少所需的 gem

ruby-on-rails - 等待 Capybara Rails 中的重定向

ruby 。无法添加来源

lisp - 使用 Define 的 Scheme 中的 Y Combinator

tree - 查找树中最深的节点 (Lisp)

go - 在 Go 中解析 s 表达式