プログラミング言語Lispの方言の1つ。 1984年に当時主流だったLISP方言のうち、MacLISP系方言を主としてまとめられ、1994年に、ANSI Common Lispは、ANSI INCITS 226-1994として規格化された。(後に改訂されANSI INCITS 226-1994 (R2004) )
など
参考になるweb
ステップ19 変数を使いやすく このステップでは次の機能を実装する。 変数に名前を付けられるようにする。 変数から配列の形状を知ることができるアクセサを実装する。 プリティプリンタを実装する。 変数に名前を付ける <variable>クラスにnameスロットを足し、コンストラクタ関数から指定できるようにする。 (defclass <variable> () ((data :initarg :data :accessor @data) (name :initarg :name :initform nil :accessor @name) ; 名前を記録する (gradient :initform…
ソースコード ステップ18 メモリ使用量を減らすモード 計算の途中で得た微分は不要な場合が多いため、用が済んだら消去するように改良する。 また、逆伝播を無効にするモードも実装する。 モード切替を実装するにあたり、backward総称関数にキーワード引数を追加する代わりにスペシャル変数を定義することにした。 というのも、オリジナルのコードでretain_gradは一カ所しか使っていないし、enable_backpropとコンテキストマネージャの件はCommon Lispが持つスペシャル変数の典型的な用例ではないかと思ったからである。その特性から言って、総称関数はインターフェースとして安定している…
ソースコード ステップ17 メモリ管理と循環参照 弱参照を使うことで、循環参照を解消し、メモリ使用量を減らす。 循環参照があると、参照カウント方式のメモリ管理では解放が難しいという。ガベージコレクタの方式によっては循環参照になっているオブジェクトでも解放できるが、コストが高いらしい。マニュアルによればSBCLは世代別GCを持っているとのことである。 Common Lispでは弱参照がANSI Common Lispの範囲にないため、処理系ごとにAPIがばらばらに定義されている。そこで、統一的に扱うためのラッパーとしてtrivial-garbageというライブラリがあるので使うことにした。 Py…
ソースコード ステップ11 可変長の引数(順伝播編) 可変長引数を取り扱うため、callやforwardのシグネチャを変更し、関数の入力も出力もリストとなるよう変更する。 総称関数の特性上影響が大きく、コンパイルエラーを参考に直していくことになる。 ステップ12 可変長の引数(改善編) Common Lispの関数は、仮引数リストの中で&restを使うことで可変長引数を受け取れるようになる。 forwardは総称関数として実装しているので、すべてのクラスで同じシグネチャにしなければならない。 オリジナルを見ると、仮引数リストが異なる同名のメソッドが定義されており、これでも問題ないところに違いを…
ソースコード ステップ9 関数をより便利に まず、呼び出し側が毎回gradientに全要素が1の配列を設定しなければならないのを直す。 ユーティリティ関数として次のようなものを定義する。 (defun full-like (array fill-value) (let ((dims (array-dimensions array))) (make-array dims :initial-element fill-value))) (defun ones-like (array) (full-like array 1)) あとは次の行を書いておけば、gradientが未設定の時、初期値を設定でき…
ソースコード ステップ4 数値微分 Common Lispでは0.942のような浮動小数点数リテラルを読み取ると、デフォルトで単精度浮動小数点数型(single-float)として扱ってしまう。この挙動は (setf *read-default-float-format* 'double-float) という行を挿入すれば変更できる。自分はそうする代わりに0.942d0のようにリテラルで型を明示する方針を取った。 オリジナルのPythonコードでは__call__メソッドを利用することで、関数とDeZeroの関数を同じように扱える。そのため普通の関数を使って合成関数を表すことができる。Ruby…
はじめに Common Lispで深層学習コンパイラを作っている人に感銘を受けたので、プログラミングの練習のためにと自分もCommon Lispで似たものを書いてみようと思い、この本を買った。 ゼロから作るDeep Learning ❸ ―フレームワーク編作者:斎藤 康毅オライリージャパンAmazon 本のソースコードはここで公開されている。 github.com 先駆者の方々も何人かおられるようなので、参考にする。 msyksphinz.hatenablog.com github.com github.com 実装の方針 行列を表現するなら、PythonであればNumPy一択だが、Commo…
Common Lispのコンパイラマクロの限界を探る https://zenn.dev/g000001/scraps/aad744485e4549 #zenn
kdotdev.com 「動的型付という性質上どうしてもプロダクトの堅牢性が落ちてしまう」という意見は、動的型付のCommon Lisp界隈ではほとんど耳にしたことがない。 Common Lispには100万行超のプロジェクトもぽつぽつあるが、堅牢性に難があるという話も耳にしない。100万行越えのプロジェクトの例だとAxiomなどがある。Google Flightの中身もビルドに数時間掛るような規模のCommon Lispである。 www.open-axiom.org Common Lispには実行時にしか動作が確定しないような文法も用意されているが、evalにせよprogvにせよプログラマは…
消滅したサイトをRSS購読してみて10日位経過したが、なかなかQoLが向上している気がする。 もちろんCommon Lisp関係のトピックがなかなか刷新されないというのはあると思うが……。 とりあえず古くても何度読んでも面白そうなものを置いてみる。 http://atom.cddddr.org/ewige-wiederkunft/bc.xml http://atom.cddddr.org/ewige-wiederkunft/cl-intern.xml http://atom.cddddr.org/ewige-wiederkunft/shiro.xml ※shiroさんのブログは勿論消滅していま…
標準入力した文字列を、文字を要素とするリストに変換 (let* ((lst (concatenate 'list (read-line))) (lst2 (mapcar #'type-of lst))) (format t "~A~%" lst) (format t "~S~%" lst) (format t "~A~%" lst2) (format t "~S~%" lst2)) とすると » cl 002b.lisp hello (h e l l o) (#\h #\e #\l #\l #\o) (STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR STAN…
たとえば、Cで /* comment */ とするところをelispでどうやるか。 結論:ブラケット[]で囲む(と一応できる)。 リンク:elisp - How can I create block (multiline) comments in Lisp code? - Emacs Stack Exchange 以上。 以下は補足というか注意事項。 まあ、elispにブロックコメントがないというのは昔から知られている。 じゃあ、一時的にコメントアウトして動作を確認したいときとかどうするのかというとM-x comment-regionとかやればええやん、というのが通説である。 じゃあなんでブラ…
ABC 001bでACしたソースコードが以下の通り。 (let* ((m (read)) (vv (cond ((< m 100) "00") ((<= m 5000) (format nil "~2,'0d" (* m (expt 10 -2)))) ((<= m 30000) (+ (* m (expt 10 -3)) 50)) ((<= m 70000) (+ (/ (- (/ m 1000) 30) 5) 80)) (t 89)))) (format t "~A~%" vv)) 躓いたところ、忘れてたところを列挙する。Clispの出力結果をコピペしてるため、説明に不要な文字が含まれるが…
時間開けるとCommon Lispに関する知識が抜け落ちるので、素早く思い出せるように。 当分は昔解いたAtCoder Beginners Contestで躓いたこととか、記法を忘れたこととかやると思う。
問い:C言語は難しいか? 答え:C言語の言語仕様自体は難しくないが、C言語でのプログラミングは難しい(私見)。C言語が簡単なのか難しいのか問われた場合、C言語の「なに」の難易度について問われているのか考えなくてはならない。 C言語そのものは難しくない C言語の言語本体や標準ライブラリ部分──すなわちC言語という「抽象化された計算モデル」とでもいうべき部分については、さほど難しくない。C言語の仕様はシンプルだ。C言語にオブジェクト指向プログラミングのための機能を追加することから始まった言語であるC++/Objective-Cと比較すれば、そのシンプルさは一目瞭然だろう。C++の仕様は大きく複雑だ…
ソースコード ステップ14 同じ変数を繰り返し使う 微分を累算して、同じ変数を使っても結果がおかしくならないようにする。 オリジナルのコードにある次のコード片をCommon Lispにどう翻訳するか少し悩んだ。そのままだと(@gradient x)という式があちこちに出てくるし、aops:vectorizeマクロで書けないのである。 if x.grad is None: x.grad = gx else: x.grad = x.grad + gx 解決策として、UIOPというライブラリで定義されたuiop:if-letというマクロを使うことにした。uiop:if-letは判定に使う値に名前を付…
本記事は、ラムダノートで発売している『定理証明手習い』を買っていただいた方に「読んで」とお願いするための「私家版、読み方のおすすめ」です。そもそも定理証明とか自分には関係ないしっていう人も多いと思うので、「気になるけど買ってない」という方に興味を持ってもらうことも目的としています。 /**/ 「ラムダノートの本の読み方(私論)」シリーズはこれで第3回なのですが、前回からは丸1年も空いてしまいました。この間に『実践プロパティベーステスト』を出版し、プログラムの挙動を検証する本について語れることが増えたので、そのあたりの世界観自体から話を始めていきたいと思います。 テストケースを手作りして挙動を確…
はじめに プログラミングを始めるには、どの言語でも開発環境の構築が必要である。この記事ではCommon Lispの開発環境をEmacsというテキストエディタとSteel Bank Common Lisp(以下SBCLと呼ぶ)という言語処理系を用いて説明する。 まず、SBCLをインストールし、動作確認を行う。次に、サードパーティのライブラリを利用するためのQuicklispというソフトウェアを導入する。そしてEmacsをインストールし、Common Lispプログラムの編集とデバッグを容易にするため、Slyを中心にパッケージを導入する。 導入手順 SBCLのインストール Common Lispは…