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