プログラミング言語はステートメントなしでも動作しますか?


9

JavaScriptでのプログラミングとして、ステートメントとブロックで実行できるすべてが式だけで実行できることに気づきました。プログラミング言語は式のみで問題なく動作しますか?そして、もしそうなら、なぜステートメントがまったく使われるのですか?


2
はい、RubyやLispのすべての方言など、すべてが式である言語はたくさんあります。
amara 2012

@sparkleshyわかりました、ただの推測です。JavaScriptのコンマに似た演算子があります(2つのステートメントを実行し、最後のステートメントの値を返します)?これは通常、2つのステートメントを順番に実行するための解決策ですか?CLのprognをアナログとして数えていると思います。2以上の式で機能する場合でもそうです。
MaiaVictor

1
すべてが式であるということは、通常のステートメント言語と異なって見える必要はありません。ステートメントは...値を持つだけです。JavaScriptのステートメント式を作成した場合、既存のコードすべて完全に有効になります。
amara

1
CoffeeScriptは、JavaScriptにコンパイルされるすべてが式の言語です。
スポーク

1
関連(重複の可能性があります):式がステートメントではない言語では、どのような有用な表現が不可能でしょうか? 「回答に記載されているように、なぜ多くの文法がexprとstmtを区別しているのか、意味がありません。」
gnat 2014

回答:


14

承知しました。最も簡単な方法は、現在ステートメントであるすべての構成に結果値を割り当て、それを式に変換することです。ただし、これは必ずしも有用または意味があるわけではありません。唯一の潜在的な利益は、概念的な単純さのビットです。ただし、場合あなたがして(代わりに他の演算子と関数を経由してチェーンを必要とする)セミコロンやループのようなものを取り除くに進み、多額のステートメントを使用してプログラムが醜くなります。

これを行うためのより根本的でありながら意味のある方法、ほとんどすべてのもの意味のある値を持つように言語を設計し、他の効果ではなく、ほとんど常にその意味のある値の式を使用する方法で使用することです。関数型プログラミング言語がこれを行います(たとえば、Haskellには式ではない宣言があります)。

命令型パラダイムでは、有用な結果値を持たない多くの一般的な操作があり、シーケンシャル命令の概念(計算ではなく)がそのパラダイムに非常に適合するため、ステートメントが使用されます。プログラムの大部分が状態を変化させている場合、新しい値を計算するのではなく、値を生成することを要求しても意味がありません(forループの結果はどうなりますか?)。対照的に、パラダイム(FP)全体が値の計算に基づいて構築されている場合、結果値を持たない外れ値は例外を保証しません。代わりに、意味のないセンチネル結果を与えます。


-1これは本当ではありません
アマラ

3
@sparkleshy正しくない部分とその方法は?

1
最初の段落:ステートメントに有用な戻り値がある(しかし多くはそうである)という考えを疑い、醜いことを提案します(なぜですか?)。2番目の段落:すべての関数型プログラミング言語がこの醜い周辺の概念を使用していることを宣言します。これはばかげています。3番目の段落:false、{}ブロックでは既に値が無視されているため、問題が発生せず、正しくありません。あなたはすでに彼らにvoidの値の欠如を与えています、nullはそれよりも意味がありませんか?全体:これは本当ではありません
amara

2
@sparkleshy-有用な戻り値を持つステートメントはありません。そのため、それらはステートメントです。それらには有用な副作用(割り当てなど)があるかもしれませんが、同じことではありません。これは実際には周辺の概念ではありません。N番目の学位を取れば、完全に実用的ではないにしてもよく知られています。そして、そのセンチネル値はnullやvoidではなく、両方と微妙に異なる単位です。デルナンがこれを補うために+1。
Telastyn

4
@sparkleshy(1)式(ステートメントの唯一のコンポーネントである可能性があります)とステートメント(式ではなく、結果値がない)を混同している可能性があります。(2)なに?FPの擁護者なら誰でもそれを確認します(それが良いことだと主張します)。それとも、あなたが反対する「すべて」の部分だけですか?(3){}ブロックは私が話しているものです(「順次命令の概念」)。そして、どこで問題が発生すると私は言いますか?voidnull/ の違いunitは、後者は値であり、渡せることvoidですが、その型の値がないという点で特別です。

5

「ステートメント」と「式」の定義方法によって異なります。

非常に厳密な定義では、「副作用があるもの、おそらく戻り値があるもの」としてのステートメントと「戻り値はあるが副作用がないもの」としての式を区別します。このような定義では、少なくとも1つのステートメント(式を評価してその戻り値を出力する必要があります)がないと、意味のあるプログラムを作成できません。純粋な式だけでは、プログラムの外部と対話できません。純粋でない部分が言語からサポートエコシステムに移動された場合、言語だけでも完全に純粋です(つまり、ステートメントがありません)(言語には定義と式があるが、Haskellはまさにそれを行います)。 。

ただし、式で副作用を許容すると、ステートメントと式の区別が恣意的になり、興味が減ります。もちろん、式のみで構成されるプログラミング言語を作成することもできます。ほとんどのLisp方言はそのように動作します。このような状況では、式の副作用を評価することは、ステートメントを実行することとほとんど同じであり、そのような言語では、式とステートメントは同じものであると主張することができます。したがって、ステートメントと式の違いは構文のみです。

技術的な理由ではなく読みやすさのために有用であるため、多くの言語はこの構文の区別を依然として行っています。何かを式にすると、その戻り値に関心があることを示しますが、副作用は少なくなります。これをステートメントにすることは、副作用を引き起こす意図があることを読者に知らせ、戻り値は興味深い場合とそうでない場合があります。


読みやすさに関するコメントの+1 ...最終的に、人間はそれを理解する必要があります...
mattnz

1

ATLXtendは、ステートメントを使用せずに機能するプログラミング言語です。多くの関数型言語もステートメントレスです。したがって、はい、プログラミング言語はステートメントがなくても問題なく機能します。文は多くの言語で命令型プログラミングからの遺物だと思います。それらは広く知られており、場合によってはコードを読みやすくするために使用されます。


1

はい。

関数型言語(および単一代入言語)はすべて式です。例はHaskal(およびSISAL)です。ここで、ifステートメントとforループの両方が値を返します。

言語には他にもクラスがあります。簡単に思い浮かぶのは宣言型言語です(ステートメントに依存しない言語は他にもたくさんあると思います)。これらの言語では、式は必要ありません(通常考えるのと同じ意味で)。あなたは真実を宣言し、あなたは複数の結果を得ることができます。ここで簡単なのはprologです。


Haskellには宣言がありますが、式ではありません。
Janus Troelsen 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.