IIRC,vb6 允许不带 () 的函数调用。IIRC,只要 func 没有返回值,就可以使用它,并且您始终可以使用 func(same, params, here)。
还有哪些其他语言允许这样做?你认为没有括号的 func 应该是什么意思?他们的规则是什么?
免责声明:我正在设计一种语言,所以如果我接受了这个想法你会感到不安,那么请不要写它。
IIRC,vb6 允许不带 () 的函数调用。IIRC,只要 func 没有返回值,就可以使用它,并且您始终可以使用 func(same, params, here)。
还有哪些其他语言允许这样做?你认为没有括号的 func 应该是什么意思?他们的规则是什么?
免责声明:我正在设计一种语言,所以如果我接受了这个想法你会感到不安,那么请不要写它。
几乎所有 ML 沿袭的函数式语言(Miranda、Haskell、OCML、F#、SML 等)都不需要括号来进行函数调用。
例如,在 Haskell 中:
Prelude> (\x->x) 1
1
匿名身份函数用 1 调用并返回 1
puts "Hello, world!"
红宝石
def hello_world name
puts "Hello world, #{name}."
end
hello_world 'Hal'
如果你愿意,你可以,但你不必使用括号,这在增加可读性和减少歧义的情况下非常有用。
在函数式编程语言(ML、Haskell、F#、OCAML)中,任何函数都只有一个参数 - 多参数函数由传递元组或Currying表示。因此,函数不需要将参数括在括号中。
例如#1:
inc x = x + 1
res = inc 42
例#2:
sum a b = a + b
res = sum 1 2
在 #2 中,您传递1
给sum
然后使用2
(Currying)调用生成的函数
此外,您可以使用函数组合、管道或 $-operator(无点样式)等机制。
只需比较两个示例。
a = f(g x)
b = f $ g x
print(square(parse "Hello"))
"Hello" |> parse |> square |> print
在其他语言中减少括号的另一种方法是引入扩展方法(类似于管道)或箭头运算符。
相比:
ToString(Parse(42))
"42".Parse().ToString()
(*(*SomePointer).SomeMember).Invoke();
SomePointer->SomeMember->Invoke();
Ruby 和 Perl 允许在没有括号的情况下调用子例程,VBC 风格的语言(Visual Basic、VBScript)也可以这样做。Lisp/Scheme 的函数调用也不需要括号(但无论如何都有很多括号^^)
Coffeescript是一种很棒的语言,它可以编译成 Javascript,并且不需要括号,即使是嵌套的方法调用也是如此。
例如:
y = Math.pow 10, Math.floor Math.log10 x
变成:
var y = Math.pow(10, Math.floor(Math.log10(x)));
Ruby 是另一种允许但不需要(在大多数情况下)方法调用上的括号的语言。
在定义方法时,它们也是可选的。
def say_hi your_name
puts "Hello, #{your_name}!"
end
当一个方法是另一个方法的参数时,Ruby 1.8.* 会在未来版本中给出关于需要括号的警告。尝试理解这一点,然后在 irb 中尝试:
puts "guess what this does?".slice 6, 4
几个非传统或无括号使用的例子:
目标-C:[object functionNamePart1:arg1 functionNamePart2:arg2]
或:[object function]
F-Script(基于objective-C):object functionNamePart1:arg1 functionNamePart2:arg2
或:object function
语言:(+ 2 2)
珀尔:
To call subroutines:
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.
F# 不需要参数 - 特别是在使用管道运算符时。
a(b(c(d(10)))) ;;
相当于:
10 |> d |> c |> b |> a ;;
(与扩展方法类似的效果,真的)
在 Ruby 中,方括号始终是可选的(类似于 VB)——但在 Ruby 中,它们在声明方法时甚至是可选的:
def echo( foo )
return foo
end
等同于:
def echo foo
return foo
end
JavaScript 是一个示例,说明没有括号的函数“调用”可能意味着:引用。在允许将函数视为对象的语言中,函数名只是另一个变量。
此外,在 PHP 语言结构(如 echo 或 exit)中,即使它们带有参数,也不需要括号,因此“echo $foo”的含义与“echo($foo)”相同,“exit $foo”的含义与“退出($foo)”。
向前
: STAR [CHAR] * EMIT ;
: STARS 0 DO STAR LOOP CR ;
: SQUARE DUP 0 DO DUP STARS LOOP DROP ;
: TRIANGLE 1 DO I STARS LOOP ;
: TOWER ( n -- ) DUP TRIANGLE SQUARE ;
括号是注释。
Powershell 函数不需要在函数调用的参数周围加上括号。但是,这会引起很多混乱:
function test($a,$b) {
write-host $a
}
test(1,2)
以上打印:1 2
(因为(1,2)
是 Powershell 中的一个数组,它被传递给 $a)
但问题是方法调用(对象上)需要括号
Haskell 也不需要括号。
http://www.madore.org/~david/programs/unlambda/
Unlambda curries 函数与 ` 符号一起使用,因此它不使用括号。