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!"
関数型プログラミング言語(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は、関数呼び出しにも括弧を必要としません(ただし、とにかく多くの括弧があります^^)
ルビー
def hello_world name
puts "Hello world, #{name}."
end
hello_world 'Hal'
必要に応じて、括弧を使用する必要はありません。これは、読みやすさが向上し、あいまいさが減少する場合に最適です。
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
非伝統的または括弧なしの使用のいくつかの例:
Objective-C:[object functionNamePart1:arg1 functionNamePart2:arg2]
または:[object function]
F-Script(Objective-Cに基づく):object functionNamePart1:arg1 functionNamePart2:arg2
または:object function
舌足らずの発音:(+ 2 2)
JavaScriptは、親なしの関数「呼び出し」が意味するものの例です:参照。関数をオブジェクトとして扱うことができる言語では、関数名は単なる別の変数です。
また、PHP言語コンストラクト(echoやexitなど)では、引数を取っても親は必要ないため、「echo $ foo」は「echo($ foo)」と同じ意味で、「exit$foo」はと同じ意味です。 「exit($ 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 ;
括弧はコメントです。
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.
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
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 は ` 記号と一緒に関数をカリー化するため、括弧は使用しません。