ディスカッション (11件)
Lispというプログラミング言語の系譜は非常に奥深く、多種多様な方言が存在します。本稿では、モダンな開発から歴史あるシステムまで幅広く使われている「Common Lisp」「Racket」「Clojure」「Emacs Lisp」の4つの主要なLisp系言語に焦点を当て、それぞれの特徴や使い分けについて解説します。どのLispがあなたのプロジェクトに最適なのか、その全貌を探っていきましょう。
Clojure 1.6にEmacs 24.5か…。どちらもかなり古いバージョンだね。
素晴らしいアンソロジー!自分のLispであるLoonのPRを出しておいたよ: https://github.com/clarkgrubb/hyperpolyglot/pull/139 (https://github.com/clarkgrubb/hyperpolyglot/pull/139)
この分野でJankがどうなっているのかも見てみたいね。
このページの目的はCommon Lisp、Racket、Clojure、Emacs Lispの構文比較だっていうのは分かってるんだけど、もっと慣用的な書き方がある例もいくつかあると思う。例えば最初の例:
(defun add (a &rest b)
(if (null b)
a
(+ a (eval (cons '+ b)))))
evalは避けるべきだし、nullの代わりにendpを使うべきだね:
(defun add (a &rest b)
(if (endp b) a
(apply #'add (+ a (first b)) (rest b))))
これはすごくいいね。
ずっとやりたいと思っているのが、クロスLispパッケージマネージャーの作成かな。面白いだろうし。実装固有のものにはclj/cljsのような動的ディスパッチを使ったり、あるいは簡単に実行・評価できるコードを優先したりする感じだと良さそう。
ページにはCommon Lispにドキュメント用の関数がないと書かれているけど、実際にはこれがあるよ。
(documentation 'documentation 'function)
"Return the documentation string of Doc-Type for X, or NIL if none
exists.
System doc-types are VARIABLE, FUNCTION, STRUCTURE, TYPE, SETF, and T.
あと、色々なプログラミング言語での実装タスクを比較できる http://rosettacode.org もおすすめだよ。
プログラマーではないけれど、PythonとCは初心者から中級レベルの者です。今Lisp(正確にはElisp)を学習中なんだけど、詩を読んでいるような気分だよ。説明するのが難しいほど超越的な体験だね。すごく美しい概念ばかりだし、C言語ベースの言語とは全く違う流れ方をしている。
CLについてのメモ:
-
「コンパイラ」の行が空なのはなぜ?SBCLでスニペットやファイルを読み込むたびに(マシンコードへ)コンパイルされるんだけど。compile-fileもあるしね。
-
インタプリタ:同様に、SBCLではデフォルトですべてコードがコンパイルされていて、REPL上でもインタプリタは使われない。インタプリタを使うならこれが必要: https://github.com/lisp-tips/lisp-tips/issues/52 (https://github.com/lisp-tips/lisp-tips/issues/52)
-
コマンドラインプログラム:Racketのセルでは-e (eval)の使用例があるけど、どんなCL実装でも同じことができるよ。
-
文字列分割の行でcl-ppcreが紹介されているから、cl-strも載せるといいかも :D (宣伝) (join, trim, concatなどがかなり簡潔に書ける)
-
ああ、日付や時刻、リストのフラット化、ハッシュテーブルのリテラルなど…もっとライブラリが必要だね。
-
ファイル操作についても: https://lispcookbook.github.io/cl-cookbook/files.html (https://lispcookbook.github.io/cl-cookbook/files.html)
-
Emacsバッファ:Lemのバッファと比較してみて 8-)
-
posix-getenv:自分ならuiop:getenvを使うかな(各実装に含まれているし)
-
uiop:command-line-arguments
-
exit:uiop:quit
-
uiop:run-program (同期) / launch-program (非同期)
-
Javaとの相互運用:LispWorksやABCLなど(あるいは他のライブラリ)で可能
個人的な意見でした
関連するかもしれないけど、Pythonプログラマーが典型的なPython関数やメソッドに対応するElispの書き方を確認できる「チートシート」をメンテナンスしているよ。
https://kickingvegas.github.io/elisp-for-python/ (https://kickingvegas.github.io/elisp-for-python/)