Language agnostic 是否有任何现有语言允许函数名中任意位置的函数参数?

Language agnostic 是否有任何现有语言允许函数名中任意位置的函数参数?,language-agnostic,syntax,programming-languages,lang,Language Agnostic,Syntax,Programming Languages,Lang,当我们(用某种语言)写作时: 我们认为它是英语“填空”结构的缩写,如: length of __ 但是当我们写这些东西的时候: isAnInteger(n) appendTo(n,m) 我们会想到这样的句子: __ is an integer append ___ to ___ 因此,允许函数调用表达式(如: (n)isAnInteger append(n)to(m) 其中“函数名”类似于: _isAnInteger append_to_ 有人能

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

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

  length of __
但是当我们写这些东西的时候:

  isAnInteger(n)
  appendTo(n,m)
我们会想到这样的句子:

  __ is an integer
  append ___  to  ___
因此,允许函数调用表达式(如:

  (n)isAnInteger
  append(n)to(m)
其中“函数名”类似于:

  _isAnInteger
  append_to_

有人能说出允许这样做的现有编程语言吗?我知道面向对象语言让对象成为前面的一个参数,但我想知道是否有更灵活的语法。

是的,确实存在这样的情况,但问题中给出的确切语法并不存在

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

$('<div/>')
 .css('background', '#f00')
 .css('width', '100px')
 .css('height', '100px')
 .hide()
 .appendTo('BODY')
 .fadeIn();
括号显然是函数参数分隔符。但您还需要函数名分隔符和对象/事物分隔符。更好的语法是:

n.isAnInteger().append(n).to(m)
这与jQuery语法非常相似:

 $('DIV')
  .filter(':visible')
  .appendTo('#new_element');
它将找到可见的
DIV
元素,并将它们复制到id为
new\u element
的元素中,这可能是最接近的。例如:

- (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];

但是它不允许使用
[obj5:isAnInteger]

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

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

所以你可以写:

5 isInteger
aList appendTo: anotherList
aList at: aPosition ifAbsent: anAction
所有消息都发送到必须位于左侧的对象(接收器),因此您不能写入:

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

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

正确命名方法后,很明显,第一个参数是较低的索引,第二个参数是较高的索引,这与大括号不同。

Mixfix是上述通过Objective-C实现的Smalltalk语法功能的最一般形式。它是最清晰的实现。更一般地说,.

是一种新的教育语言(仍在发展中),它支持几乎任意的论点顺序:

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

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

正如Brian Rice指出的,Maude中的mixfix符号正好处理了这一点。你甚至有正确的语法

你的例子

_isAnInteger
append_to_
将在莫德宣布为

op _IsAnInteger : Int -> Bool
op append_to_ : Int List -> List
将被称为

5 IsAnInteger
append 5 to L

Objective-C方法调用的形式通常为
[anObject performOperation:operation with task:task and integer:integer]
,等等。它本身并不灵活,但(IMO)的读取更自然。您可以在标准ML中定义中缀函数。例如,您可以将函数
定义为
,以便调用者将
n写入m
,而不是
写入(n,m)
。这并不完全是您想要的,但它确实有一些相似之处(特别是因为您可以编写
append
to
,以便稍后调用
append(n到m)
)。Smalltalk、Objective-C、Agda、BitC和其他。See和@SASTERATEALIEN OBJECTOR-C有关键字参数吗?询问者不是询问更好的语法,而是询问特定的语法。函数链接不是任意的。
MyObject.new.chooseBetween { print("Yes") } and { print("No") }
_isAnInteger
append_to_
op _IsAnInteger : Int -> Bool
op append_to_ : Int List -> List
5 IsAnInteger
append 5 to L