Какие другие языки программирования имеют синтаксис передачи Smalltalk- like message-?

Какие языки существуют с синтаксисом передачи message-, похожим на Smalltalk? Objective-C - единственный, с которым я знаком. В частности, мне было интересно, существуют ли какие-либо другие реализации языка, которые допускают синтаксис в форме, подобной: [anObject methodWithParam:aParam andParam:anotherParam], содержащей сообщения, которые разрешают именованные параметры как часть определений методов.

В целом я нахожу, что этот синтаксис может способствовать более согласованным именам методов, которые более четко показывают намерения методов и что цена, которую вы платите в многословии, в целом стоит того. Я хотел бы знать, есть ли другие языки, которые поддерживают это.

Ответ 1

Вот список языков, поддерживающих синтаксис ключевых слов, аналогичных Smalltalk:

  • Objective-J, Objective- Modula- 2. Это языковые расширения, похожие на Objective-C.
  • Strongtalk, диалект Smalltalk с опцией strong-
  • F- script, встраиваемый диалект Smalltalk с расширениями операций с массивом APL-.
  • Self
  • Newspeak
  • Slate
  • Atomo, вложенный язык для Haskell

Ответ 2

В дополнение к другим упомянутым здесь языкам Fancy:

osna = City new: "Osnabrück"
p = Person new: "Christopher" age: 23 city: osna
p println

berlin = City new: "Berlin"
p go_to: berlin
p println

Ответ 3

См. Self.

Кроме того, многие языки поддерживают необязательные именованные параметры, например. Python или С# (начиная с v4).

Ответ 4

Python и Common Lisp (возможно, среди других) позволяют использовать аргументы ключевого слова. Вы можете выполнять вызовы функций, которые включают имена параметров.

Они не эквивалентны именам методов Obj- C, потому что ключевое слово args игнорирует позицию, но они отвечают на ваш вопрос об удобочитаемости. *

make_an_omelet(num_eggs=2, cheese=u"Gruyère", mushrooms=True)

(make-a-salad :greens 'boston-lettuce 
              :dressing 'red-wine-vinaigrette 
              :other-ingredients '(hazelnuts dried-apricots))

Это, конечно, не передача сообщений, а просто старая функция вызова.


* У них есть другое использование, кроме этого, например, задание значений по умолчанию.

Ответ 5

Ada поддерживает именованные параметры.

function Minimum (A, B : Integer) return Integer is
begin
   if A <= B then
      return A;
   else
      return B;
   end if;
end Minimum;

Затем вызовите:

Answer := Minimum (A=>100, B=>124);

Ответ 6

Ruby может отправлять сообщения объектам для вызова своих методов, в основном как objc:

class Foo
  def bar a,b
    a + b
  end
end

f = Foo.new
f.send(:bar, a=4, b=5)
>> 9

Действительно, между прочим, это делает возможным интеграцию между Cocoa и Ruby в MacRuby

Ответ 7

Erlang не претендуют на объектно-ориентированную структуру, но передача сообщений является ключевой концепцией на этом языке.