不需要括号的函数语言有哪些?

8

据我所知,vb6允许不带()的函数调用。只要该函数没有返回值,就可以使用func(same, params, here)。其他哪些语言也允许这样做?你认为不带括号的func应该表示什么?它们的规则是什么?

免责声明:我正在设计一种语言,如果您会因为我采用了这个想法而感到不满,请不要写下评论。


2
这肯定是 VB6 的一个“特性”,普遍受到了厌恶? - anon
5
“er,Neil,你说你自己吧。至于我,我喜欢简洁的语法...” - Iraimbilanja
15个回答

5

几乎所有来自ML系列的函数式语言(Miranda,Haskell,OCML,F#,SML等)在函数调用时不需要括号。

例如,在Haskell中:

Prelude> (\x->x) 1
1

匿名身份函数被调用并传入1,返回1。

5

Tcl

puts "Hello, world!"

4

PerlSmalltalk是其中的两个例子。(请注意,它们都允许使用括号,但并非在所有情况下都需要使用。)


3

Ruby

def hello_world name
   puts "Hello world, #{name}."
end

hello_world 'Hal'

如果你想的话,可以使用括号,但并不强制要求,在增加可读性和减少歧义的情况下,这是很棒的。

4
在长串的参数调用中,有时需要使用括号来指明参数的正确顺序,否则解释器无法正确理解。 - workmad3

3
Coffeescript是一门很棒的语言,它编译成Javascript并且即使是嵌套的方法调用也不需要括号。
例如:
y = Math.pow 10, Math.floor Math.log10 x

成为:

var y = Math.pow(10, Math.floor(Math.log10(x)));

2

Ruby是另一种语言,它允许但不强制(在大多数情况下)在方法调用时使用括号。

在定义方法时,括号也是可选的。

def say_hi your_name
  puts "Hello, #{your_name}!"
end

当一个方法作为另一个方法的参数时,Ruby 1.8.* 版本会发出有关需要在未来版本中使用括号的警告。请理解这个警告,然后在irb中尝试一下:

puts "guess what this does?".slice 6, 4

切片,然后输出。为了将切片函数与整数一起输出,我猜你需要再加一个逗号。 - Cees Timmerman

2
在函数式编程语言(ML、Haskell、F#、OCAML)中,任何函数只有一个参数 - 多参数函数通过传递元组或柯里化来表示。因此,函数不需要用括号括起参数。
示例1:
inc x = x + 1
res = inc 42

第二个例子:
sum a b = a + b
res = sum 1 2 

在#2中,您将1传递给sum,然后使用2调用生成的函数(柯里化)。
此外,您可以使用函数组合、管道或$-运算符等机制(无点风格)。
只需比较这两个示例即可。
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在函数调用时也不需要括号(但仍有许多括号^^)。

1

Powershell函数在调用时不需要在参数周围加括号。尽管如此,这会引起很多混淆:

function test($a,$b) {
write-host $a
}

test(1,2)

以上打印输出: 1 2
(因为 (1,2) 在 Powershell 中是一个数组并且被传递给了 $a)
但事实上,对于对象的方法调用需要使用括号。

1

Perl:

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.

http://perldoc.perl.org/perlsub.html


1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接