9

当我们(用某种语言或另一种语言)写作时:

   lengthOf(n)

我们认为它是英语“填空”结构的缩写,例如:

  length of __

但是当我们写这样的东西时:

  isAnInteger(n)
  appendTo(n,m)

我们想到这样的句子:

  __ is an integer
  append ___  to  ___

因此,允许函数调用表达式似乎更自然,例如:

  (n)isAnInteger
  append(n)to(m)

“函数名称”类似于:

  _isAnInteger
  append_to_

任何人都可以命名允许这样做的现有编程语言吗? 我知道面向对象的语言让对象成为前面的一个参数,但我想知道更灵活的语法。

4

7 回答 7

3

As Brian Rice pointed out, mixfix notation in Maude handles this exactly. You've even got the correct syntax.

Your examples

_isAnInteger
append_to_

Would be declared in Maude as

op _IsAnInteger : Int -> Bool
op append_to_ : Int List -> List

And would be called as

5 IsAnInteger
append 5 to L
于 2012-06-08T15:31:40.487 回答
3

Mixfix 是上面通过 Objective-C 呈现的 Smalltalk 语法特性的最通用形式。Maude 的“气泡”解析是对此进行最清楚记录的实现。更一般地说,谷歌搜索“mixfix parsing”

于 2012-04-18T20:52:22.093 回答
1

Smalltalk 非常接近。(它与Objective-C的语法相同,在另一个答案中提到)

Smalltalk 中的消息发送不使用大括号,但遵循格式doSomething:with:

所以你可以写:

5 isInteger
aList appendTo: anotherList
aList at: aPosition ifAbsent: anAction

所有消息都发送到一个必须在左边的对象(接收者),所以你不能写:

append: aList to: anotherList   "illegal syntax"

语法doSomething:with:比使用大括号更自然。您不太容易混淆哪个参数是什么。例如考虑:

   aList.sublist( i, j )
   aList sublistFrom: i to: j

通过正确命名方法,很明显第一个参数是下索引,第二个参数是上索引,这与大括号不同。

于 2012-04-18T06:49:47.627 回答
1

Grace是一种新的教育语言(仍在开发中),它支持几乎任意顺序的参数:

class MyObject {
    method choseBetween (a : Block<None>) and (b : Block<None>) -> None {
        if (Random.nextBoolean)
            then { a.apply } else { b.apply } }
}

这可以被称为:

MyObject.new.chooseBetween { print("Yes") } and { print("No") }
于 2012-04-22T00:37:51.767 回答
1

是的,确实存在这样的事情,但不是问题中提出的确切语法。

在 JavaScript 中,它被称为链式链接,通常在 jQuery 等框架中找到,以便动态创建和修改 DOM 元素:

$('<div/>')
 .css('background', '#f00')
 .css('width', '100px')
 .css('height', '100px')
 .hide()
 .appendTo('BODY')
 .fadeIn();

前面的 jQuery 代码片段创建一个DIV元素,设置宽度、高度和背景颜色,隐藏DIV,将其附加到文档并应用淡入效果。

语法很重要。给定以下示例:

(n)isAnInteger
append(n)to(m)

括号显然是函数参数分隔符。但是您还需要函数名称分隔符和对象/事物分隔符。更好的语法是:

n.isAnInteger().append(n).to(m)

这与 jQuery 语法非常相似:

 $('DIV')
  .filter(':visible')
  .appendTo('#new_element');

它将找到DIV可见的元素并将它们复制到具有 id 的元素new_element

于 2012-04-18T04:07:04.943 回答
0

我想到了两种支持 mixfix 运算符的语言:AgdaBitC

于 2012-04-28T17:14:40.837 回答
0

Objective-C可能是最接近的。例子:

- (void)setRangeStart:(int)start end:(int)end;

- (void)importDocumentWithName:(NSString *)name withSpecifiedPreferences:
(Preferences *)prefs beforePage:(int)insertPage;

像这样调用:

[obj setRangeStart:1 end:42];
[obj importDocumentWithName:@"foo" withSpecifiedPreferences:prefs beforePage:1];

虽然它不允许[obj 5:isAnInteger]

于 2012-04-18T05:06:18.433 回答