プログラムを上から下に読み上げる方法は?

「一般原則として、プログラムを飛び跳ねるのではなく、上から下に読み上げるようにします。専門家は、上から下への順序が読みやすさに最も寄与することに同意します。」

Wolfram言語でそれを行うのは難しいと思います。他の多くの言語では問題ありませんが、関数が定義されていないと、Wolfram言語では使用できません。 Wolfram言語でそれをする方法はありますか?

例えば、

main[x]

[email protected]_ := [email protected]@f[x]

[email protected]_ := x+1
[email protected]_ := x+2
[email protected]_ := x+3

残念ながら、コードを2回評価しない限り機能しません。

上下構造の利点を誰もが知っているわけではありません。

プログラム/機能はツリー構造になっています。 ツリーの最上部が最上位レベル、ツリーの最下部が最下位レベルです。

あなたが機能/プログラムを理解しようとするとき、あなたは最初に最高レベルから始めることができます。それが必要ならば、あなたがあなたが必要とする詳細を理解したと思うまであなたはより低いレベルを研究することができます。

enter image description here

Haskellの例

build :: XcodeScheme -> IO (EBS String)
build xcodeScheme = createBuildOptionSets xcodeScheme >>>= cleanFrameworks >>>= buildFrameworks >>>= combineFrameworks xcodeScheme

createBuildOptionSets :: XcodeScheme -> IO (Either (BuildError String) [XcodebuildOptionSet])
createBuildOptionSets xcodeScheme = getSupportedPlatforms xcodeScheme >>>= createBuildOptionSets' xcodeScheme

cleanFrameworks :: [XcodebuildOptionSet] -> IO (EBS [XcodebuildOptionSet])
cleanFrameworks optionSets = do
    mapM_ cleanFramework optionSets
    return $ Right optionSets

buildFrameworks :: [XcodebuildOptionSet] -> IO (EBS ([XcodebuildOptionSet], [FilePath]))
buildFrameworks optionSets = buildFrameworks' optionSets >>= checkBuildResults optionSets

ところで、引用はWolfram Technology Conferenceからのものです。他の言語でもできますが、Wolfram言語でそれを実行する方法がわからないのです。

enter image description here

7
nl ru de
私の答えを受け入れてくれてありがとう。 :-)
追加された 著者 ricree,
インタラクティブなHaskellでは、 main を定義しないと起動できません。コンパイルされたHaskell(またはC)では、定義がロードされた後に main がインフラストラクチャによって暗黙的に呼び出されます。上から下への原則は曖昧ですが、 main を定義する前に main [x] を評価することで間違いなく違反されます。
追加された 著者 Lehane,
それがエントリーポイントです。 mainはHaskellプログラムの入り口点として定義されています(Cのmain関数と同様)
追加された 著者 Elocution Safari,
@Kuba Cにはもう一つの短い例があります。
追加された 著者 Elocution Safari,
足りない部分は関数宣言だと思います。もしWolfram言語が関数宣言をサポートしていれば、それは問題の解決策になるでしょう。
追加された 著者 Elocution Safari,
あなたの言うとおりです。それはREPLです。 Haskellは両方をサポートしています。 MathematicaはREPLのようです。
追加された 著者 Elocution Safari,
@ Mr.Wizard私はパッケージを開発していましたが、開発中にこの問題が発生しました。ツリーのように合理的な方法でコードを整理するのは難しいと思います。私がコードを読むとき、私はそれを最高の抽象レベルから読むことを好みます。もっと詳細が必要な場合は、知っておくべきことがわかったと思うまで、低い方の抽象レベルを読みます。この質問は本当に私を悩ませました。これで問題は解決しました。どうもありがとうございます!
追加された 著者 Elocution Safari,
それではあなたのhaskellの例の中の類似の main [x] はどこにあるのでしょうか?
追加された 著者 Kuba,
そのような「一般的な原則」は実際にはWolfram言語の哲学に反すると私は考える
追加された 著者 QuantumDot,

4 答え

引用はプレゼンテーションから来ています。それはその執筆を主張する

x //
f //
g //
h

より優れている

h @
g @
f @
x

または

h[
  g[
    f[
      x
     ]
   ]
 ]

As one argument it invokes the so-called "top-to-bottom principle" which asserts that it is easier to read code if the top-to-bottom textual またはder matches the execution またはder.

If we accept this principle, then the example given is in violation since main[x] must be executed after the following definitions have been established. To confまたはm to the principle, main[x] should be last.

In the comments to the question there is discussion concerning the use of main in Haskell and C. Like Mathematica, interactive Haskell demands that main be defined befまたはe it is executed. In compiled Haskell and C, the invocation of main is implicit -- but occurs after the source code has been compiled, linked and loaded. Mathematica has no notion of an implicit main program.

The top-to-bottom principle can never be considered absolute. Code execution is resolved to a well-またはdered set of instructions (to a good approximation, on conventional architectures). By contrast, code definitions fまたはm a general netwまたはk that cannot always be linearized.

But definitions must always be established chronologically befまたはe they are executed. So, to confまたはm to the principle, definitions must also precede executions textually. In this regard, the ability to confまたはm would seem to be no wまたはse in Mathematica than other languages (including Haskell and C).

6
追加された

OPはHaskellの観点から考えすぎているようです。私はWL/Mathematicaについてもっと経験を積むことをお勧めします - それはHaskellのものより(はるかに)古い血統を持つ異なる関数型プログラミングパラダイムに属します。

それで、OP質問に対する可能な答えの1つは、以下の参考文献を読む/研究することです。

  1. Paul Grahamの本 "On Lisp" 、Prentice Hall、1993年、 432ページ、ペーパーバック。 ISBN 0130305529(または少なくともそのまえがき)。

  2. 「Mathematicaでビッグコードを書くための一般的な戦略」の回答

  3. 「Mathematicaの優れたプログラミング方法の例はどこにありますか」の回答

  4. 深刻なケーススタディとして、 Mathematicaのデザインパターンを特定できるか? "</の回答

覚えておくべきこと:

  • Mathematica/WLプログラマは、対応する抽象構文ツリー(AST)の観点からよく考えています;
  • Haskellのプログラマーは、Haskellの型システムに付随する宣言的思考にあまりにも興味を持っています。

(もちろん、Haskellプログラムは最終的にはASTに変換されます。)

5
追加された

ノートブックに出力

ある観点からすると、それに影響を与える新しい定義を出力式に「認識」させたいと思うでしょう。これは 動的 に実装されています。

main[3]//Dynamic

[email protected]_ := [email protected]@f[x]

[email protected]_ := x + 1
[email protected]_ := x + 2
[email protected]_ := x + 3
  9
 

ステップバイステップでこのステップを確認するには、カーネルをリセットして評価します。

main[3]//Dynamic
Pause[1];

[email protected]_ := [email protected]@f[x]
Pause[1];

[email protected]_ := x + 1
Pause[1];

[email protected]_ := x + 2
Pause[1];

[email protected]_ := x + 3

(* main[3] -> h[g[f[3]]] -> 1 + g[f[3]] -> 3 + f[3] -> 9 *)

プログラムによる使用

もう1つのよりプログラム的な観点から見ると、コードは既に機能しています。 またしても新しいカーネルで:

result = main[3];

[email protected]_ := [email protected]@f[x]

[email protected]_ := x + 1
[email protected]_ := x + 2
[email protected]_ := x + 3

result が使用されると、それは望み通りに振る舞います。例えば:

IntegerQ[result]
Print[result]
  True

9
 
2
追加された

私はそれが達成可能だと思います。実際にはそれはWolfram言語の哲学に反する必要はありません。私は「すべてが表現である」ということが哲学の一部であると思います。

最初のWolfram言語の例では誤りを犯しました。

に:

main[x]

[email protected]_ := [email protected]@f[x]

[email protected]_ := x+1
[email protected]_ := x+2
[email protected]_ := x+3

でる:

main [x]

「間違い」は微妙です。 Wolfram言語の精神に従えば、コードを式として書き直すことができます。

に:

(*Function *)
main[h_, g_, f_, x_] := [email protected]@f[x]

[email protected]_ := x + 1
[email protected]_ := x + 2
[email protected]_ := x + 3

(*Evaluating Functions*)
main[h, g, f, 3]

でる:

9

仕組み

それがどのように機能するかを説明するために、式をツリーに変換することができます。

[email protected]@main[h, g, f, 3]

Mathematica graphics

コードを書き直す前に、3つのフリー変数をメインに使用しました。だからこそ、古いコードの出力はmain [x]です。新しいコードでは、境界変数を使用したので、f、g、hの前にmainを定義しても構いません。

Free variable & Bounded variable

自由変数は、置換が行われる可能性がある式内の場所を指定する表記法です。

束縛変数は、以前は自由だった変数ですが、特定の値または一連の値に束縛されています。

0
追加された