“ lispモードで脳を動かすにはどうすればよいですか?”

StackOverflow https://stackoverflow.com/questions/606533

質問

私の教授は、次のプログラミング課題にプログラミング言語を選択できると言った。私は関数型言語を試してみるつもりでしたので、clojureを試してみることにしました。問題は、構文を理解し、基本的な概念を理解していることですが、すべてを「クリック」するのに問題があります。頭の中。誰かアドバイスはありますか?それとも、関数プログラミングを開始するのに間違った言語を選択しているのでしょうか?

役に立ちましたか?

解決

自転車に乗るようなもので、練習が必要です。 ProjectEuler で問題を解決してみてください。最終的にはクリックされます。

「The Little Schemer」という本について誰かが言及しました。これは非常に良い読み物です。 Schemeを対象としていますが、実際の問題は解決する価値があります。

がんばって!

他のヒント

まあ、私にとっては、OCAMLを始めた当初と同じ問題に遭遇しましたが、秘trickはコードから何を望むかと< em>ない その方法 !!!

たとえば、リストの要素の平方を計算するには、リストの長さとそのようなトリックを忘れて、次のように数学的に考えてください

  • リストが空の場合-&gt;完了です

  • そうでない場合、リストには先頭と末尾が必要です-&gt;頭の二乗を計算してから、尾についても同じことをするよう関数に依頼します。

一般的なケースと基本的なケースについて考えてください。また、データを出力しているので、それを変更しないでください(変更したくない場合は;))。

がんばって!

The Little Schemer をチェックアウトできます。

これについては: http://www.defmacro.org/ramblings/lisp.html

これは、通常の命令型プログラマー(Java、C#など)の観点から、Lispで考えることの非常に簡単なステップバイステップの紹介です。

教育目的のために、PLTスキームをお勧めします。これは、非常に優れた例とさらに優れたドキュメントを備えたポータブルで強力な環境です。関数型プログラミングの背後にある考えを段階的に、非常にきれいな方法で発見するのに役立ちます。実装する小さなアプリケーションを選択すると、新しい言語の学習に役立ちます。

http://www.plt-scheme.org/

さらに&quot;コンピュータープログラムの構造と解釈&quot; H. Abelssn、G。Sussman、J。Sussmanの著書は、Scheme(およびプログラミング)に関する非常に良い本です。

よろしく

mue

Clojureに固有ではないLispに関するいくつかの考え(私はLispの専門家ではないので、それらが大部分が正しく有用であることを願っています):

ASTでのコーディング

コンパイラーやインタープリターの理論についてはほとんど知りませんが、Lispでコーディングするたびに、ASTを直接構築するような気がします。

これは&quot; code = data&quot;の一部ですつまり、Lispでのコーディングは、データ構造(ネストされたリスト)をASTノードで埋めることによく似ています。驚くばかりで、読みやすいです(適切なテキストエディタを使用)。

プログラム可能なプログラミング言語

コードチャンクはネストされたリストであり、リスト操作は言語の一部です。したがって、Lispコードを生成するLispコードを非常に簡単に書くことができます(Lispマクロを参照)。これにより、Lispは(それ自体で)プログラム可能なプログラミング言語になります。

これにより、 DSL またはLispのインタープリターを非常に簡単に作成できます( メタ循環評価)。

絶対にリブートしない

ほとんどのLispシステムでは、実行時にコード(ドキュメントを含む)を内省し、ホットスワップできます。

高度なOOP

その後、ほとんどのLispシステムには、CLOSから派生した何らかのオブジェクトシステムがあります。CLOSは、(多くのOOP実装と比較して)高度で構成可能なオブジェクトシステムです( The Art of the Metaobject Protocol )。

これらすべての機能はかなり前に発明されましたが、他の多くのプログラミング言語で利用できるかどうかはわかりません(ただし、ほとんどはクロージャなどに追いついています)ので、「再発見」する必要があります。練習してこれらに慣れる(他の回答の本を参照)。

覚えておいてください:それはすべてデータです!

次のように、Lispが得意とするいくつかの単純な古典関数を記述します

  • リストを逆にする

  • 原子がs-expressionのどこかにあるか教えてください

  • 2つのs-expressionsが等しいかどうかを判断するEQUALの記述

  • s-expressionの端にある原子のリストを取得するには、FRINGEを記述します

  • SUBSTを書き込み、次にSUBLISを書き込みます

  • 記号的微分

  • 代数単純化

  • 単純なEVALおよび/またはAPPLYを記述する

これらの種類の副作用のない関数型プログラムにLispが適していることを理解してください。

これは、ステートフルな副作用(非機能)プログラムにも役立ちますが、これらは「プログラム」に似ています。 「関数」よりも。

特定のアプリケーションにとって最適なのは、アプリケーションによって異なります。一般に、必要以上の状態情報を含めないでください。

簡単!

  

M-x &nbsp; lisp-mode

OK、OK。だから、あなたは脳のためのEmacsを持っていないかもしれない。すべての真剣さで、あなたがする必要があるのは、再帰が本当に上手になることです。再帰の概念を標準的な例以外に拡張しようとすると、最初は非常に頭がゆがむことがありますが、最終的には、より流動的でリッピーなコードになります。

また、多くの人が括弧にこだわるので、その理由はよくわかりません。構文は非常にシンプルで一貫性があり、数分で習得できます。私にとっては、C ++とJavaを学んだ後、Schemeに来ました。そして、「関数」の違いはおよび「演算子」間違った二分法であり、その区別が排除されたことを見ると爽快でした。

関数型プログラミングに関しては、関数がファーストクラスの値であり、他の関数との間でやり取りできるという事実に頭を包むことができる限り、大丈夫です。これの有用性は時間の経過とともに明らかになりますが、関数を取得する関数と関数を返す関数を作成できれば十分です。

最後に、Clojureがマクロに対してどのようなサポートを提供しているかはわかりませんが、Lispの重要な部分と考えられています。ただし、上記の項目に精通するまで、それらの学習について心配することはありません-マクロは非常に便利で汎用性がありますが、私が言及した他の手法よりも頻繁に使用されることもありません。

解釈可能な言語から始めます。 Moscow ML は非常に簡単であることがわかりました。これは、標準MLの軽量実装です。

私の個人的なプラクティスは、小さなプロジェクト(3〜5泊でハッキングする必要のあるもの)を見つけて実装することです。ブログフィルターツールはどうですか?たぶん、ハノイの塔やリンクリストの実装(通常は1泊のプロジェクトです)。

通常動作する方法は、最初はうまく実装せず、持っていたものを捨てて、数時間でクリックします。

大きな助けは、...うーん... LISPのようなコースを受講することです! :)宿題は多くの概念に立ち向かわせ、学期が終わるずっと前にクリックしてくれました。

がんばって!!

頑張って。 「プログラミング言語」の半分くらいまでかかりました。 Schemeが「クリック」される前の大学のコース。しかし、いったんそれが起こると、すべてが理にかなったことになり、関数型プログラミングが大好きになりました。

LispでLispインタープリターを作成します。

もしあなたがアラドをしていなければ、Lispがユニークな言語である理由を読んでください。最初にこれを行わないと、他のプログラミング言語でできることと同じことをしようとします。

次に、いくつかの小さなものを実装してみてください(あなたに役立つか、やる気がないかもしれません)。

Lisp in a box は、足を濡らすのに最適な方法です。

私にとって重要なことは、すべてを「lisp-y」の方法で実行することです。 「Javaではここでforループを使用しますが、Lispでforループを実行するにはどうすればよいですか」と考えたくはありません。しかし、十分な例とチュートリアルを確認するには(誰かが指摘したように、 SICP はこれに最適です)コードが「Lisp-y」に見えて共通言語パラダイムを認識したときにスポットを開始できます。

私はたった今書いたコードを見て、その言語とプラットフォーム/フレームワークに対してそれが正しくイディオムであることを直感的に知っていることを確かに知っています-それは「クリックする」ときです

編集:そして、機能的な言語を選択することに対する称賛、より少ない学生はJavaでそれをやったでしょう:)

クリックすると言ったのは誰ですか? いつも混乱しています

しかし、Lispマクロの背後に隠れる抽象化の程度を考えると。その後、脳が爆発します。

:)

プログラミングClojureをチェックアウトします。それは非盗聴者にとって素晴らしい本です。

他のSO'ersがすでに提案しているものに加えて、ここに私の2セントがあります:

  1. 言語の学習を開始し、言語のいくつかの単純な数値/趣味の問題を試してください
  2. 重要:ソリューション/コードをStackOverflowに投稿し、それが本当にLISPy 方法であるかどうかを人々の意見を求めます。

幸運を祈ります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top