世界を動かす技術を、日本語で。

自分だけのLispを作ろう

概要

C言語 の学習と 自作プログラミング言語 の構築を1000行で体験できる書籍紹介。 Lisp の仕組みや魅力、実践的なプロジェクト開発手法の習得。 無料オンライン公開 や各種フォーマットでの提供。 読者の 体験談 や書籍の評価も掲載。 初心者から経験者まで幅広い層におすすめ。

Build Your Own Lisp ― C言語で自作プログラミング言語を作る体験

  • C言語 を学びながら 独自のプログラミング言語 を構築する書籍
  • たった 1000行のコード でLisp系言語の作成プロセスを解説
  • Lisp の独特な構造や魅力の理解
  • 実用的なプロジェクト開発 の進め方を習得
  • 問題解決を 簡潔かつ美しく 実現するコーディング手法
  • オンラインで無料公開、すぐに学習開始可能
  • 印刷版 や主要電子書籍フォーマットでも販売
  • 読者の声 :「Cプログラマーとしてやっと一人前になれた」、「全プログラマーが一度は体験すべき」、「インターネットで見つけた最高の教材の一つ」
    • @hirojin
    • @mattcaldwell
    • @euryadam

こんな人におすすめ

  • C言語 を基礎から応用まで学びたい人
  • 自作言語 の開発に興味があるプログラマー
  • Lisp や関数型言語の仕組みを知りたいエンジニア
  • 実践的なプロジェクト を通じて成長したい初心者・経験者
  • 無料で高品質な教材 を探している学習者

Hackerたちの意見

作者が自分の作品を無料でオンラインに公開してくれて、本当に感謝してる。昔、これに似たエクササイズを自分でもやったことがあるんだけど(本じゃなくてコードだけね)、すごく楽しかったし、満足感もあったよ。結局、そのコードは残らなかったし、他のプロジェクトにも使えなかったけど。私のはエラーハンドリングも含めて5キロ行くらいになったけど、短くすることは考えてなかった。もっと深く理解してる人たちが作った、すごく短いコードには感心したな。このプロジェクトが本当にCを学ぶことに関するものであるなら、既存の超短い個人用Lispから始めて、それを構造的に読み進めることで、さらにその視点が強化されたかもしれない。私もそれをやってみたいし、Yコンビネータのevalをデバッグしてるときに半分それに頼ったこともあった。あの時、自分のデザインの選択が悪かったことや、単純な式評価をしているときに気づかなかった欠陥が浮き彫りになったんだ。ちゃんとしたテストハーネスを作るのも大事だったし、こういう旅の中で強調すべきポイントだと思う。既存の高品質な短い個人用LispやSchemeへの参考もあれば、嬉しいかも。

これは「自分だけのLispを作る」以上のものだよ。ほぼそれ以外の何かって感じ。自分の「プログラミング言語」を作ることでCを学ぶための素晴らしいリソースだし、Lispの慣習に縛られない。私にとって「自分だけのLispを作る」の最も「Lispっぽい」側面は、作者が自分の事前構築したパーサーライブラリ「mpc」を使っているところにあると思う。(本の中でソースのリンクを見つけられなかったから、https://github.com/orangeduck/mpc)「car」や「cdr」、「caddar」みたいなものを見つけられなかったのが、本当に「自分だけのLispを作る」っていう啓示だと思う。https://en.wikipedia.org/wiki/CAR_and_CDR パーサーはとても広く、そしてすごく便利で、表記スタイルに依存しない。例えば、Lispのほぼ普遍的な「ポーランド記法」とかね。(そのバリエーション、例えば「ケンブリッジポーランド記法」など)完璧な例として、「第9章: 式を読む」の中で: > LispはConsセルを使わないの? > 他のLispではS式の定義が少し異なる。ほとんどの他のLispでは、S式は原子(シンボルや数値)か、2つの他のS式が結合されたもの、またはconsとして定義される。 > これは自然に、私たちが使っているのとは異なるデータ構造であるリンクリストを使った実装に繋がる。この本では、シンプルさのためにS式を可変サイズの配列として表現することにしたけど、公式な定義や典型的な実装は微妙に異なることを知っておくことが重要だよ。https://www.buildyourownlisp.com/chapter9_s_expressions#Read... これは素晴らしい教育リソースだと思う。「自分だけのLispを作る」以上に広めるべきだと思う。

残念ながら、新しいLisp(ClojureやJanet)の実用性の一部は、CARやCDRを捨てて、効率的な異なるデータ構造タイプ(トライ、配列、配列リスト、ハッシュマップ)を使うことにシフトしていることだね。そして、ホモアイコニシティが勝利の特徴として、リンクリストやCAR/CDRのアイデアから強制的に切り離されている。

「自分だけのLispを作るな」: https://gist.github.com/no-defun-allowed/7e3e238c959e27d4919... みんなに知っておいてほしい。おもちゃを超えるスケールのLispを作りたいなら、あまり良いソースじゃないよ。Cを少し学んだり、言語を作るヒントを得ることはできるけど、学んだことの中には長期的には足かせになるものもあるから気をつけて。

Cを学ぶために使うべきじゃないよ。悪いCがいっぱいだし。

それはひどいね。もっと良いリソースはないの?

この作者は実際にはいい人なんだろうけど、リスパーがこんなに自信満々でうざいのを見たのは初めてだ。何度もサティライズされてるのを見たけど。

誰かが私の古い自己コンパイリングのScheme-to-Cコンパイラを約1k行のSchemeコードで保存してくれたみたい。https://github.com/veqqq/llvm_scheme/blob/main/compile.ccode... (llvmバージョンもある)読んで比べてみるべきかな。私のは本当に遅いPocで、SICPに触発されたんだけど、その本は今でもどこかのコースで使われてるのかな?

Lispの比較(表現力、制限、利用可能な特別な形式など)をしているリソースってある?Lisp 1と2.0についてよく読むんだけど、Clojureは呼び出し可能なキーワードがあるからLisp 1.5って言われてるよね。LLMに触れてみて、LispがツールをLLMに晒すのにすごく面白いフォーマットになるんじゃないかと思ってる。つまり、LLMにLispでプログラムを作らせて、それをシステム内で処理(解析、修正、分析、評価)してユーザーの目標を達成するって感じ。

Lisp 1と2.0 それって、名前空間の数としてLisp-1とLisp-2のことを言ってるの? https://dreamsongs.com/Separation.html - このトピックについて詳しく解説してるよ。Common Lispの標準化の文脈で、それぞれの利点と欠点を含めて議論してる(最終的には実用性の観点からCommon LispにはLisp-2が適してると主張してるけど、将来的にはどちらか一方に厳密に賛成するわけではない)。Common Lispは、Lisp 1.5から発展したいろんなLispの統合みたいなもので、Schemeではないんだ。彼らはみんなLisp-2で、関数と値の間にLisp 1.5の分離を保ってる。SchemeはLisp-1で、名前空間を統一してる。CL(および関連するLisp)ではfuncallを使わなきゃいけないけど、Schemeではs-exprの先頭に関数を直接使えるのが主な違いだよ。(let ((f ...)) ;; 関数に評価される何か (f ...)) ;; Scheme (funcall f ...)) ;; Lisp

関連リンク: 自分だけのLispを作ろう - https://news.ycombinator.com/item?id=36103946 - 2023年5月(12コメント) Cを学んで自分だけのLispを作ろう(2014) - https://news.ycombinator.com/item?id=35726033 - 2023年4月(45コメント) Cを学んで自分だけのLispを作ろう(2014) - https://news.ycombinator.com/item?id=27598424 - 2021年6月(86コメント) Cを学んで自分だけのLispを作ろう(2014) - https://news.ycombinator.com/item?id=17478489 - 2018年7月(86コメント) Cを学んで自分だけのLispを作ろう - https://news.ycombinator.com/item?id=10474717 - 2015年10月(49コメント) Cを学んで自分だけのLispを作ろう - https://news.ycombinator.com/item?id=7530427 - 2014年4月(145コメント)

いろんな角度からこの問題に取り組んでるんだけど、まだ解決できてない。: https://github.com/codr7/shi-c https://github.com/codr7/hacktical-c

最近、Iosevkaフォントのクリエイターが自分のLisp実装を使って作ったって知った。フォント: https://github.com/be5invis/Iosevka 言語: https://github.com/be5invis/PatEL 彼らが言語を作るために使ったツール: https://github.com/be5invis/patrisika こういうプロジェクトは本当にインスピレーションを与えてくれる。これに対して1%でも達成できれば十分だな。Belleve / Renzhi Liやそのチームのような人たちがいるって知るだけで、自分も頑張れば同じようなことができるかもしれないって思えるから、朝起きるのが楽しみなんだ。彼らのような人がいて、自由にシェアしてくれるのはすごいことだよ。本当にありがとう。追記: インスピレーションについて: Hope 16は来週だね :D https://www.hope.net/pdf/hope_16_schedule.pdf

そのリンクを見てみたけど、そのフォントプロジェクトでこのLispが使われてるのは見つけられなかった。どうやら全部JavaScriptで作ったみたい。

他の人も指摘してるけど、これはLispを作ることだけじゃなくて、Cを学ぶことにも関係してるよね。後者に興味があるなら、Peter NorvigがPythonで簡易的なSchemeインタープリターを作るプロジェクトを持ってるよ。いくつかのショートカットを使って、環境には約30個の関数しか提供してないし、特別な形式は5つ(quote, if, define, set!, lambda)しか認識しないけど、全体で150行未満で、こういうのに不慣れな人にはすごく参考になるよ。 https://norvig.com/lispy.html

iso-9899.infoのC言語のウェブサイトには、「避けるべきもの」セクションにこの本も含まれてるよ。 https://www.iso-9899.info/wiki/Books#Stuff_that_should_be_av...

え?そうじゃないよ。