Каково происхождение блочного синтаксиса Ruby? - PullRequest
3 голосов
/ 18 апреля 2019

В 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.

Спасибо!

1 Ответ

5 голосов
/ 18 апреля 2019

Создатель Ruby, "Matz", сказал, что дизайн Руби был вдохновлен 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]

1009 * Лисп *

(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)

Eiffel

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
...