6

IIRC,vb6 允许不带 () 的函数调用。IIRC,只要 func 没有返回值,就可以使用它,并且您始终可以使用 func(same, params, here)。

还有哪些其他语言允许这样做?你认为没有括号的 func 应该是什么意思?他们的规则是什么?

免责声明:我正在设计一种语言,所以如果我接受了这个想法你会感到不安,那么请不要写它。

4

15 回答 15

5

几乎所有 ML 沿袭的函数式语言(Miranda、Haskell、OCML、F#、SML 等)都不需要括号来进行函数调用。

例如,在 Haskell 中:

Prelude> (\x->x) 1
1

匿名身份函数用 1 调用并返回 1

于 2009-06-07T08:21:37.540 回答
4

Tcl

puts "Hello, world!"
于 2009-06-07T08:26:31.463 回答
3

PerlSmalltalk就是几个例子。(请注意,两者都允许括号,但并非在所有情况下都需要括号。)

于 2009-06-07T08:22:20.660 回答
3

红宝石

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

hello_world 'Hal'

如果你愿意,你可以,但你不必使用括号,这在增加可读性和减少歧义的情况下非常有用。

于 2009-06-07T08:43:17.513 回答
3

在函数式编程语言(ML、Haskell、F#、OCAML)中,任何函数都只有一个参数 - 多参数函数由传递元组或Currying表示。因此,函数不需要将参数括在括号中。

例如#1:

inc x = x + 1
res = inc 42

例#2:

sum a b = a + b
res = sum 1 2 

在 #2 中,您传递1sum然后使用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 的函数调用也不需要括号(但无论如何都有很多括号^^)

于 2009-06-07T12:38:04.030 回答
3

Coffeescript是一种很棒的语言,它可以编译成 Javascript,并且不需要括号,即使是嵌套的方法调用也是如此。

例如:

y = Math.pow 10, Math.floor Math.log10 x

变成:

var y = Math.pow(10, Math.floor(Math.log10(x)));
于 2016-02-02T09:45:15.233 回答
2

Ruby 是另一种允许但不需要(在大多数情况下)方法调用上的括号的语言。

在定义方法时,它们也是可选的。

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

当一个方法是另一个方法的参数时,Ruby 1.8.* 会在未来版本中给出关于需要括号的警告。尝试理解这一点,然后在 irb 中尝试:

puts "guess what this does?".slice 6, 4
于 2009-06-07T08:31:41.827 回答
1

几个非传统或无括号使用的例子:

目标-C:[object functionNamePart1:arg1 functionNamePart2:arg2]
或:[object function]

F-Script(基于objective-C):object functionNamePart1:arg1 functionNamePart2:arg2
或:object function

语言:(+ 2 2)

于 2009-06-07T08:15:43.620 回答
1

珀尔:

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

于 2009-06-07T08:21:39.163 回答
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
于 2009-06-07T08:25:49.357 回答
1

JavaScript 是一个示例,说明没有括号的函数“调用”可能意味着:引用。在允许将函数视为对象的语言中,函数名只是另一个变量。

此外,在 PHP 语言结构(如 echo 或 exit)中,即使它们带有参数,也不需要括号,因此“echo $foo”的含义与“echo($foo)”相同,“exit $foo”的含义与“退出($foo)”。

于 2009-06-07T12:11:07.593 回答
1

向前

: 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 ;

括号是注释。

于 2009-06-07T12:12:58.633 回答
1

Powershell 函数不需要在函数调用的参数周围加上括号。但是,这会引起很多混乱:

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

test(1,2)

以上打印:1 2

(因为(1,2)是 Powershell 中的一个数组,它被传递给 $a)

但问题是方法调用(对象上)需要括号

于 2011-11-22T06:46:23.450 回答
0

Haskell 也不需要括号。

于 2009-06-07T08:18:29.763 回答
0

http://www.madore.org/~david/programs/unlambda/

Unlambda curries 函数与 ` 符号一起使用,因此它不使用括号。

于 2010-12-31T21:31:32.703 回答