还有哪些其他编程语言具有类似Smalltalk的消息传递语法?

时间:2011-05-26 21:39:17

标签: objective-c syntax language-design smalltalk message-passing

哪些语言的消息传递语法类似于Smalltalk? Objective-C是我唯一熟悉的。具体来说,我想知道是否存在任何其他语言实现允许使用如下形式的语法:[anObject methodWithParam:aParam andParam:anotherParam],具有允许命名参数作为方法定义的一部分的消息。

一般来说,我发现这种语法有助于更一致的方法名称,更清楚地显示方法的意图,而且你付出的字面价格通常是值得的。我很想知道是否有其他语言可以支持这一点。

7 个答案:

答案 0 :(得分:14)

以下是支持与Smalltalk类似的关键字消息语法的语言列表:

答案 1 :(得分:5)

除了此处提到的其他语言,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

答案 2 :(得分:3)

参见例如Self

此外,许多语言都支持可选的命名参数,例如: Python或C#(从v4开始)。

答案 3 :(得分:2)

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

当然,这不是消息传递,只是简单的旧函数调用。


*它们还有其他用途,例如指定默认值。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

Ruby可以向对象发送消息以调用他们的方法,就像objc一样:

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

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

事实上,除此之外,这使得MacRuby中Cocoa和Ruby之间的集成成为可能

答案 6 :(得分:-1)

Erlang并不声称是面向对象的,但是消息传递是该语言的关键概念。