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

関数型プログラミング言語(ML、Haskell、F#、OCAML)では、どの関数にも1つの引数しかありません。マルチパラメーター関数は、タプルの受け渡しまたはカリー化によって表されます。したがって、パラメータを括弧で囲む関数は必要ありません。

例1:

inc x = x + 1
res = inc 42

例2:

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

#2では、(カリー化)を使用して、結果の関数に渡し1てからsum呼び出します。2

さらに、関数合成、パイプライン、$演算子(ポイントフリースタイル)などのメカニズムを使用できます。

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は、関数呼び出しにも括弧を必要としません(ただし、とにかく多くの括弧があります^^)

于 2009-06-07T12:38:04.030 に答える
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

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

非伝統的または括弧なしの使用のいくつかの例:

Objective-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

JavaScriptは、親なしの関数「呼び出し」が意味するものの例です:参照。関数をオブジェクトとして扱うことができる言語では、関数名は単なる別の変数です。

また、PHP言語コンストラクト(echoやexitなど)では、引数を取っても親は必要ないため、「echo $ foo」は「echo($ foo)」と同じ意味で、「exit$foo」はと同じ意味です。 「exit($ 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

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

于 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

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 は ` 記号と一緒に関数をカリー化するため、括弧は使用しません。

于 2010-12-31T21:31:32.703 に答える