私の教授は、次のプログラミング課題のためにプログラミング言語を選ぶことができると言った。私は関数型言語を試すつもりだったので、clojure を試してみることにしました。問題は、構文を理解し、基本的な概念を理解していることですが、頭の中ですべてを「クリック」するのに問題があります。誰かアドバイスはありますか?それとも、関数型プログラミングを始めるのに間違った言語を選んでいるのだろうか?
18 に答える
自転車に乗るようなもので、練習が必要です。それでいくつかの問題を解決してみてください、多分ProjectEulerそして最終的にそれはクリックします。
誰かが「TheLittleSchemer」という本に言及しましたが、これはかなり良い読み物です。スキームを対象としていますが、実際の問題は解決する価値があります。
幸運を!
The Little Schemerをご覧ください。
これはどうですか: http://www.defmacro.org/ramblings/lisp.html
これは、通常の命令型プログラマー (Java、C# など) の観点から、Lisp で考えるための非常に単純なステップバイステップの紹介です。
99個のLispy問題を見てみましょう
教育目的のために、私は PLT スキームをお勧めします。非常に優れた例とさらに優れたドキュメントを備えた、移植可能で強力な環境です。関数型プログラミングの背後にある考えを段階的に非常にきれいな方法で発見するのに役立ちます。実装する小さなアプリケーションを選択すると、新しい言語を学習するのに役立ちます。
さらに、H. Abelssn、G. Sussman、および J. Sussman の「Structure and Interpretation of Computer Programs」は、Scheme (およびプログラミング) に関する非常に優れた本です。
よろしく
ミュー
Clojure に限定されない Lisp に関するいくつかの考え (私は Lisp の専門家ではないので、それらがほとんど正しく有用であることを願っています):
ASTでのコーディング
私はコンパイラーやインタープリターの理論についてほとんど知りませんが、Lisp でコーディングするたびに、AST を直接構築するような感覚に驚かされます。
これは「コード = データ」の意味の一部であり、Lisp でコーディングすることは、データ構造 (ネストされたリスト) を AST ノードで埋めることによく似ています。素晴らしく、読みやすいです (適切なテキスト エディターを使用すると)。
プログラム可能なプログラミング言語
したがって、コード チャンクは単にネストされたリストであり、リスト操作は言語の一部です。したがって、Lisp コードを生成する Lisp コードを非常に簡単に作成できます (Lisp マクロを参照してください)。これにより、Lisp はプログラム可能な (それ自体で!) プログラミング言語になります。
これにより、Lisp でのDSLやインタープリターの構築が非常に簡単になります (メタ循環評価も参照してください)。
何も再起動しない
また、ほとんどの Lisp システムでは、コード (ドキュメントを含む) を実行時にイントロスペクトしてホットスワップすることができます。
高度な OOP
次に、ほとんどの Lisp システムには CLOS から派生したある種のオブジェクト システムがあります。これは (多くの OOP 実装と比較して) 高度で構成可能なオブジェクト システムです ( The Art of the Metaobject Protocol を参照)。
これらの機能はすべてずっと前に発明されたものですが、他の多くのプログラミング言語で利用できるかどうかはわかりません (ただし、ほとんどはクロージャーなどで追いついています)。他の回答の本)。
覚えておいてください: それはすべてデータです!
簡単!
M-x
lisp-mode
OK、OK、だからあなたは脳のためのEmacsを持っていないかもしれません。真面目な話ですが、あなたがしなければならないことは、再帰を本当に上手にすることです。これは、再帰の概念を標準的な例を超えて拡張しようとすると、最初はかなり頭がおかしくなる可能性がありますが、最終的には、より流動的で、しなやかなコードになります。
また、多くの人が括弧に引っ掛かっていますが、その理由はよくわかりません。構文は非常にシンプルで一貫性があり、数分で習得できます。私にとっては、C ++とJavaを学んだ後、Schemeに来ましたが、「関数」と「演算子」の違いは誤った二分法だといつも思っていました。
関数型プログラミングに関する限り、関数がファーストクラスの値であり、他の関数との間で受け渡しできるという事実に頭を悩ませることができる限り、問題はないはずです。これの有用性は時間の経過とともに明らかになりますが、関数取得関数と関数戻り関数を記述できれば十分です。
最後に、Clojureがマクロに対してどのようなサポートを提供しているかはわかりませんが、マクロはlispの重要な部分と見なされています。ただし、上記の項目に精通するまでは、それらを学ぶことについて心配する必要はありません。マクロは非常に便利で用途が広いものの、前述の他の手法よりも使用頻度が低くなっています。
Lisp が得意とするいくつかの単純な古典的な関数を記述します。
リストを逆にする
アトムが s 式のどこかにあるかどうかを伝える
2 つの s-式が等しいかどうかを伝えるには、EQUAL を記述します。
FRINGE と書いて、s 式のフリンジにあるアトムのリストを取得します
SUBST を書き、次に SUBLIS を書きます。
記号微分
代数的単純化
簡単な EVAL や APPLY を書く
Lisp は、この種の副作用のない関数型プログラムに適していることを理解してください。
ステートフルな副作用 (機能しない) プログラムにも役立ちますが、それらは「関数」というよりも「プログラム」に似ています。
特定のアプリケーションにどちらが適しているかは、アプリケーションによって異なります。一般に、必要以上の状態情報を含むべきではありません。
他のSO'erがすでに提案していることに加えて、ここに私の2セントがあります。
- 言語の学習を開始し、言語のいくつかの簡単な数値/趣味の問題を試してみてください
- 重要:ソリューション/コードをStackOverflowに投稿し、それが本当にLISPyの方法であるかどうかを人々の意見を求めてください。
頑張ってください!
私は解釈できる言語から始めます。モスクワMLはかなり簡単だと思いました。これは、StandardMLの軽量実装です。
私の個人的なやり方は、小さなプロジェクト (ハッキングに 3 ~ 5 泊かかるようなもの) を見つけて実装することです。ブログフィルターツールはいかがですか?ハノイの塔やリンクリストの実装かもしれません (通常は 1 泊のプロジェクトです)。
通常、最初はうまく実装できず、持っていたものを捨ててしまい、数時間後にようやくカチッと音がします。
大きな助けは、何かのコースを取っていることです.ええと.LISP!:) 宿題は、多くの概念に直面することを余儀なくされ、学期が終わるずっと前に私にとってはクリックされました.
幸運を!!
私にとって重要なことは、すべてを 'lisp-y' な方法で行うようにすることです。「Java ではここで for ループを使用しますが、Lisp では for ループをどのように行うのでしょうか?」と考えてはいけません。しかし、十分な例とチュートリアル (誰かが指摘したように、SICPはこれに最適です) に目を通すことで、コードが「Lisp 風」に見え、共通言語パラダイムを認識できるようになります。
私が書いたばかりのコードを見て、それがその言語とプラットフォーム/フレームワークにとって正しく慣用的であることを直感的に知っているという感覚を確かに知っています-それは、それが「クリック」したときだと思います。
編集:そして、関数型言語を選択したことに対する称賛、より少ない学生はJavaでそれをやったでしょう:)
まだ読んでいない場合は、Lisp がユニークな言語である理由を読んでください。最初にこれを行わないと、他のプログラミング言語でできることと同じことをしようとすることになります。
次に、いくつかの小さなことを実装してみてください (自分にとって役立つものにするようにしてください。そうしないと、やる気が出ない可能性があります)。
Lisp in a boxは、足を濡らすのに最適な方法です。
幸運を。スキームが「クリック」されるまで、大学の「プログラミング言語」コースの途中までかかりました。しかし、一度それが起こると、すべてが理にかなっていて、私は関数型プログラミングに夢中になりました.
Lisp で Lisp インタプリタを書きます。