Ruby 的块语法的起源是什么?
What is the origin of Ruby's block syntax?
Ruby 有一个有趣的块语法(管道之间的参数后跟一系列语句):
[1, 2, 3].each do |x|
puts x
end
Rust 也使用类似的语法:
arr.sort_by_key(|a| {
let intermediate_value = some_function(a);
intermediate_value + 10
});
我想知道这种语法是否早于 Ruby(特别是在管道之间放置参数,我相信我在其他地方见过但不确定在哪里),如果是这样,哪些语言使用它?
我相信 Smalltalk 也使用管道,但用于对象初始化,我在 Google 上找不到任何其他示例。
谢谢!
Ruby 的创建者 "Matz" 表示,Ruby 的设计灵感来自 Perl、Smalltalk、Eiffel、Ada 和 Lisp。
从这个列表中,我认为它很可能来自 Smalltalk、Eiffel 和 Lisp。示例:
Smalltalk
#(1 2 3 4 5) inject: 0 into: [:sum :number | sum + number]
#(1 2 3 4 5) fold: [:product :number | product * number]
Lisp
(let ((data #(1 2 3 4 5))) ; the array
(values (reduce #'+ data) ; sum
(reduce #'* data))) ; product
(loop for i in '(1 2 3 4 5) sum i)
埃菲尔铁塔
class
APPLICATION
create
make
feature {NONE}
make
local
test: ARRAY [INTEGER]
do
create test.make_empty
test := <<5, 1, 9, 7>>
io.put_string ("Sum: " + sum (test).out)
io.new_line
io.put_string ("Product: " + product (test).out)
end
sum (ar: ARRAY [INTEGER]): INTEGER
-- Sum of the items of the array 'ar'.
do
across
ar.lower |..| ar.upper as c
loop
Result := Result + ar [c.item]
end
end
product (ar: ARRAY [INTEGER]): INTEGER
-- Product of the items of the array 'ar'.
do
Result := 1
across
ar.lower |..| ar.upper as c
loop
Result := Result * ar [c.item]
end
end
end
Ruby 有一个有趣的块语法(管道之间的参数后跟一系列语句):
[1, 2, 3].each do |x|
puts x
end
Rust 也使用类似的语法:
arr.sort_by_key(|a| {
let intermediate_value = some_function(a);
intermediate_value + 10
});
我想知道这种语法是否早于 Ruby(特别是在管道之间放置参数,我相信我在其他地方见过但不确定在哪里),如果是这样,哪些语言使用它?
我相信 Smalltalk 也使用管道,但用于对象初始化,我在 Google 上找不到任何其他示例。
谢谢!
Ruby 的创建者 "Matz" 表示,Ruby 的设计灵感来自 Perl、Smalltalk、Eiffel、Ada 和 Lisp。
从这个列表中,我认为它很可能来自 Smalltalk、Eiffel 和 Lisp。示例:
Smalltalk
#(1 2 3 4 5) inject: 0 into: [:sum :number | sum + number]
#(1 2 3 4 5) fold: [:product :number | product * number]
Lisp
(let ((data #(1 2 3 4 5))) ; the array
(values (reduce #'+ data) ; sum
(reduce #'* data))) ; product
(loop for i in '(1 2 3 4 5) sum i)
埃菲尔铁塔
class
APPLICATION
create
make
feature {NONE}
make
local
test: ARRAY [INTEGER]
do
create test.make_empty
test := <<5, 1, 9, 7>>
io.put_string ("Sum: " + sum (test).out)
io.new_line
io.put_string ("Product: " + product (test).out)
end
sum (ar: ARRAY [INTEGER]): INTEGER
-- Sum of the items of the array 'ar'.
do
across
ar.lower |..| ar.upper as c
loop
Result := Result + ar [c.item]
end
end
product (ar: ARRAY [INTEGER]): INTEGER
-- Product of the items of the array 'ar'.
do
Result := 1
across
ar.lower |..| ar.upper as c
loop
Result := Result * ar [c.item]
end
end
end