Lispの紹介 〜 令和最新版
by
t-sin
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Lispの紹介 〜 令和最新版 @t-sin 2024-01-25 Shibuya.lisp lispmeetup #113
Slide 2
Slide 2 text
背景 ● lispmeetupのオフライン開催が4年ぶり ● Lispあまりよく知らない方もいそう ● なのでLispを紹介します
Slide 3
Slide 3 text
Lispってどんな言語? ● JSやPythonやRubyに近い手ざわり ● Lispっていっぱいある – Lispは言語族の名前 ● 自己拡張性が高い – とても動的な処理系であることがおおい
Slide 4
Slide 4 text
LispとJSやRubyの似てる点 ● 高階関数やラムダ式 ● 静的型システムはない (たいていは) ● RPELがある
Slide 5
Slide 5 text
Lispと似てる点: 高階関数 ● JavaScriptによる例 (RosettaCodeより) ● https://rosettacode.org/wiki/Function_composition#ES6 var compose = (f, g) => x => f(g(x)); var id = compose(Math.sin, Math.asin); console.log(id(0.5)); // 0.5
Slide 6
Slide 6 text
Lispと似てる点: 高階関数 ● Common Lispによる例 (RosettaCodeより) https://rosettacode.org/wiki/Function_composition#Com mon_Lisp > (defun compose (f g) (lambda (x) (funcall f (funcall g x)))) COMPOSE > (let ((sin-asin (compose #'sin #'asin))) (funcall sin-asin 0.5)) 0.5
Slide 7
Slide 7 text
LispとJSやRubyの似てない点 ● S式と呼ばれる構文 ● Lispのマクロ – 構文木を構文木へ変換する – テキスト置換ではない – でも静的型はない ● (一部のLispは) REPLの機能がつよい
Slide 8
Slide 8 text
Lispはいっぱいある ● たくさんの処理系がある – Scheme, Common Lisp, Emacs Lisp, Arc, Clojure, Carp, … ● その理由はおそらく… – Schemeが言語機能の実験場だった時期がある – 比較的単純なのでアイデアをすぐに実現できる – LisperがLisp大好きすぎる (?)
Slide 9
Slide 9 text
Lispの自己拡張性 ● 関数を定義すると語彙が増える – 関数呼び出し構文はビルトインでもユーザ定義でも同じ – →言語を拡張している ● ほかにも – Lispのマクロ – 拡張可能なパーサ (Common Lisp) – 実行時情報をREPLで変更 (Common Lisp, Clojure) – 実行時にクラス定義の変更 (Common Lisp)
Slide 10
Slide 10 text
Lispの自己拡張性 ● LISP 1.5のころから自己拡張性高かった – 基本的な要素がら複雑な機能を立ち上げていく ● 川合史朗さんの『LISP 1.5の風景』に記載あり – ラムダノート社『n月刊ラムダノート Vol.1, No.2 (2019)』所収
Slide 11
Slide 11 text
Lispのよくある誤解集 ● 関数型言語である ● マクロを書きまくる ● インタプリタだから遅い
Slide 12
Slide 12 text
Lispの誤解集: 関数型言語である ● 手続き型言語です ● 高階関数とかあるけど再代入とか破壊的変更よくや る – オブジェクト指向だとなおさらやる ● Clojureは関数型言語っぽさを推しているけど、一 部破壊的変更ができるので全体としては関数型では ない
Slide 13
Slide 13 text
Lispの誤解集: マクロを書きまくる ● そんなに書かないです ● 複雑なバグを生みうるやつ – マクロのマクロのマクロの... – メタプログラミングあるある ● 関数ですむなら関数を書く ● DSLを作るときには大活躍
Slide 14
Slide 14 text
Lispの誤解集: インタプリタで遅い ● コンパイラを持ってること多し – 最近はコンパイラとインタプリタの境は曖昧 ● インタプリタだけどVM方式だったりJITもってたり ● Rubyに最近JITが入りましたよね? ● ネイティブコードコンパイラのある処理系は速い – SBCL (Common Lisp)、Chez Scheme (Scheme, R5RS) – ClojureはJVM言語なのでJVMに律速される
Slide 15
Slide 15 text
で、Lispって何ができるの? ● わりと何でもできる – Webサービス、ゲーム、OS、ツール、... ● 古い言語なのでいろんなソフトウェアがある ● もしかしたら身近なところに潜んでいるかも …?
Slide 16
Slide 16 text
Lispの事例集: スクリプト言語 1 ● GNU Emacs (Emacs Lisp) – エディタの設定とスクリプティング ● AutoCAD (AutoLisp) – CADのスクリプティング – CADってコマンド操作が基本っぽい
Slide 17
Slide 17 text
Lispの事例集: スクリプト言語 2 ● Audacity (Nyquist) – Audacityは音声波形編集ソフト – Nyquistは音声信号生成もできる ● ALSA (alisp) – ALSAはLinuxのオーディオ抽象化レイヤー – 設定言語が実はLisp ● `find / | grep alisp`してみると…?
Slide 18
Slide 18 text
Lispの事例集: Webサービス ● ハチペイのバックエンド (Common Lisp) – 渋谷区の決済アプリ – https://www.hachi-pay.tokyo/ – 株式会社ポケットチェンジ ● 広告媒体アカウント管理システム (Clojure) – https://tech-magazine.opt.ne.jp/entry/2021/01/13/124551 – 株式会社オプト ● Practical Scheme (Gauche Scheme) – https://practical-scheme.net/ – 川合史朗さん
Slide 19
Slide 19 text
Lispの事例集: ゲーム ● クラッシュ・バンディクー (1と2) – GOAL (Game Oriented Assembly Lisp) というLisp ● Kandria (Common Lisp) – メトロイドヴァニア系アクション – https://store.steampowered.com/app/1261430/Kandria/ ● Steamで買って遊べます!!!
Slide 20
Slide 20 text
Lispの事例集: ツール (1) ● pgloader (Common Lisp) – PostgreSQLのdump/loadツール – https://pgloader.io ● Maxima (Common Lisp) – 数式処理システム (Mathematicaみたいなやつ) – https://maxima.sourceforge.io/
Slide 21
Slide 21 text
Lispの事例集: ツール (2) ● Lem (Common Lisp) – テキストエディタ ● Roswell (Common Lisp + C) – Common Lispの処理系マネージャ ● Senn (Common Lisp) – 日本語入力メソッド (IME) – https://github.com/mhkoji/Senn
Slide 22
Slide 22 text
Lispの事例集: 作曲環境 ● Opusmodus (Common Lisp) – https://www.opusmodus.com/ ● Overtone (Clojure) – https://overtone.github.io ● Extempore (Scheme) – https://github.com/digego/extempore
Slide 23
Slide 23 text
Lispの事例集: そのほか 1 ● Nyxt (Common Lisp) – キーボード指向のウェブブラウザ – https://nyxt.atlas.engineer/ ● Mezzano (Common Lisp) – オペレーティングシステム – https://github.com/froggey/Mezzano
Slide 24
Slide 24 text
まとめ ● Lispはけっこういろいろできる ● Lispはカッコいい ● みんなもLispやろうぜ!!!