web-dev-qa-db-ja.com

Common Lispを実際に使用する方法を学ぶ場所

私はCommon LISPを学ぼうとしているC++プログラマーです。 Land of LISPのようないくつかの本を見て、LISPのさまざまな長所に関する数多くのオンライン記事を読みました。ただし、アドバイスが必要です。

Common LISPについて私が読んだほとんどすべては、それがどれほど驚くべきものであり、それを使って物事を驚くほど速く実行できるか、30年前に現代のプログラミング言語で多くの問題を驚くほど解決したかと関係があります。また、マクロの素晴らしさ、およびすべてのプログラミングパラダイム(OO、関数型、アクターベースなど)をLISPでどのように使用できるか、およびリストがどのようにして最終的なデータ構造であるかについても説明します。基本的にLISPを研究言語のように扱い、LISPの違いと革新性を説明します。

そして、そのすべてはおそらく本当ですが、問題は、ファイルを読み取って単語に分割し、それに対して何らかの処理を行うような実際的なことを行う方法をあまり見たことがないことです。私はCommon LISPを学ぶためにCommon LISPを学ぶことに興味はありませんが、C++で以前使用していたことをより速く、より少ないエラーで行うために興味があります。

つまり、私の質問はCommon LISPを使用して一般的なプログラミングタスクを実行する方法を教えることに焦点を当てた、最高のリソース(それはWebサイト、本など)ですのように

  • ファイルの読み方
  • ファイルを読み取り、ファイル内の単語を置き換え、結果をファイルに書き戻す方法
  • ディレクトリ内のファイルやその他のファイルシステムのものを繰り返す
  • SQLデータベースと対話する
  • ソケットを介して通信を行う
  • ウェブサーバーなどのスレッド
  • GUIを作成する
  • バイナリファイルに対して操作を実行する
  • パーサーを作成します(LISPのLISPのインタープリターではありません。これは、LISPの5行のようなものです)
  • オペレーティングシステム(つまり、CまたはC++で記述されたもの)と対話して、LISPがネイティブで実行できないことを実行する
  • CでLISP拡張を記述する方法(それは可能ですか?)
  • Luaインタープリターを埋め込みます(それは可能ですか?)

また、あまり実用的ではないが、ヒープ、スタック、バイナリ検索ツリーなどの一般的なデータ構造をLISPに実装する方法についても説明します。ただし、carcdrを正しい方法で使用します。知りません。

これのうちのどれか(リストの最後の2つを例外として除く)がLISPで不可能であるか、人々がそれをあまり好きにならないと私は強く疑います。そして、私が読んだ前述のものは、LISP(Yahoo! Webストアが思い浮かぶ)で書かれた実世界のソフトウェアの多くに言及しています。

ただし、以前に(the?)命令型言語でプログラミングしたことがあるので、実際のアプリケーションを作成するために取得した新しい知識を使用することを切望しています。では、Lispを使って実用的なソフトウェアを書くことを学ぶ最も速い方法は何でしょうか?

ちなみに、ピーター・セイベルのPractical Common LISPを見てきましたが、TOCから判断すると、にのみ触れていますLISPを使用して実行することを学びたいことの一部

もう1つ質問があります(これが2つの質問を1つに結合している場合は申し訳ありません)。LISPの関数やものへの参照はどこにありますか?

そして私本当にはLISPが好きになりたいです。

78
NewLisper

' Practical Common LISP 'を読むことをお勧めします。すでにいくつかの質問に答えているからです。

おそらく3〜4冊の本を読んでください

一般的なLISPリファレンス

マニュアル

次に確認する必要があるのは、LISP実装のマニュアルです。ネットワーキング、スレッドなど、多くの特定の拡張機能について説明しています。

一般的なLISP実装のドキュメント:

[〜#〜] slime [〜#〜] (EmacsベースのLISP-IDE)には SLIMEユーザーマニュアル があります。

一般的なLISPライブラリのドキュメント:

図書館

ライブラリの使用

さて、あなたのポイントのいくつかを見てみましょう:

  • ファイルの読み方

HyperSpec のファイルとストリームの辞書を参照してください。 WITH-OPEN-STREAM、READ、READ-LINE、READ-CHAR、READ-BYTE、READ-SEQUENCE、...

  • ファイルを読み取り、ファイル内の単語を置き換え、結果をファイルに書き戻す方法

上記を使用してください。参照:WRITEおよび関連。

  • ディレクトリ内のファイルやその他のファイルシステムのものを繰り返す

上記を参照。ディレクトリ、パス名、...

  • SQLデータベースと対話する

たとえば、CLSQLライブラリを使用します。

  • ソケットを介して通信を行う

LISPのマニュアルを参照するか、ポータブルライブラリのいずれかを使用してください。 Quicklispを参照してください。

  • ウェブサーバーなどのスレッド

LISPのマニュアルを参照するか、ポータブルライブラリのいずれかを使用してください。 Quicklispを参照してください。

  • GUIを作成する

依存します。 Quicklisp または実装固有のライブラリを参照してください。

  • バイナリファイルに対して操作を実行する

ファイルとストリームの操作については、Hyperspecを参照してください。書き込みバイト、読み取りバイト。ストリームをバイナリストリームとして開きます。

  • パーサーを作成します(LISPのLISPのインタープリターではありません。これは、LISPの5行のようなものです)

そのための既存のツールの1つを使用します。既存のパーサーを調べます。 LISPで書かれた多くのパーサーがありますが、それについての本にはあまりありません(AIの文献に記載されている自然言語パーサーを除く)。

  • オペレーティングシステム(つまり、CまたはC++で記述されたもの)と対話して、LISPがネイティブで実行できないことを実行する

依存します。 Quicklisp または実装固有のライブラリを参照してください。

  • CでLISP拡張を記述する方法(それは可能ですか?)

依存します。 Quicklisp または実装固有のライブラリを参照してください。 -> FFI

最後のアドバイス:他の作者からのコードを読んでください。

他のLISPコードを調べます。非常に多様なLISPコードが十分にあります。ウェブサーバーから作曲ソフトウェアまで。

89
Rainer Joswig

チェックアウト Cliki the Common LISP wiki これは、Common LISPで利用可能なライブラリのリストを提供し、すべてのアイテムの達成に役立ちます。

また、チェックアウトしたいのは Common LISP Cookbook です(さらに 更新バージョン もあります)。 一度に1行ずつファイルを読み取るCで記述されたライブラリと対話するための外部関数インターフェイス などの一般的なタスク用のコードがたくさんあります。

使用している実装に応じて、CでLISPの拡張機能を記述できます。たとえば、Emacs-LISPはCommon LISPではありませんが、それを可能にします。通常、やりたいことは、Common LISPでコードを記述し、さまざまなLISPコンパイラ宣言を使用して、または外部関数インターフェイスを使用する他のメソッドを使用して、コードを可能な限り最適化することです。

スレッド化は使用する実装に依存しますが、それらのほとんどは現在スレッドを持っていると思います。

Hunchentoot は、最高のLISP Webサーバーの1つであり、簡単に始めることができます。自分でスレッディングコードを記述する必要はありません。HTTPリクエストハンドラー関数を記述するだけです。

誰かがコンパイルした LISPのGUIオプションのリスト

  • gTK GUIライブラリへのインターフェースであるcl-gtk2
  • マクリム
  • ガーネット
  • 一般的なQt
  • EQL
6
Rudolf Olah