Skip to content

Lispは関数型言語

公開日:

東京都中野区中野セントラルパーク カンファレンスで開催された『関数型まつり2025』でレギュラートーク(30分)として発表しました。

Download PDF

スライドテキスト

Page 1

Lispは関数型言語

(ではない)

Lisp is (not) a functional language

pixiv Inc.

USAMI Kenta

2025-06-15 #fp_matsuri

関数型まつり 2025

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 Webエンジニアリングチーム PHPer
  • 2012年末から現職、APIとかCIとかいろいろなところを見つめてきました
  • 最近はピクシブ百科事典(dic.pixiv.net)も開発しています
  • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人 (spcamp2010)

Page 3

Page 4

Page 5

Page 6

私とλ

  • プログラミング苦手なのでいろんな言語をつまみぐいしてきました
  • 2010年… 魔法言語 リリカル☆Lispに出会う
  • 2011年… 「β簡約!λカ娘」(同人誌)を読む

アルバイト先のF#マスターに単純型なしラムダ計算を教わる

  • 2012年… SICPを解いてSchemeをちょっとかじる
  • 2013年… Emacs Lispパッケージをごりごり書きはじめる

Page 7

楽しみましたか?

Page 8

Scott Wlaschinさんの招待講演、最高でしたね…

Page 9

関数型言語使ってますか?

Page 10

関数型プログラミングしてますか?

Page 11

みなさまそれぞれの「関数型」観があると思います

Page 12

map/reduceが使えたら関数型?

Page 13

λ関数型言語とはλ (私の偏見に基く認識)

C言語

Python

Lisp

動的/静的の壁

ML系

Haskell

  • 関数定義ができれば関数型言語だよ派
  • ファーストクラスの関数抽象があれば関数型言語だよ派
  • 標準ライブラリで高階関数(map/reduce)が扱えればいいよ派
  • 代数的データ型が扱えない言語は関数型言語じゃないよ派
  • 型推論の完全性がある静的型付き言語が関数型だよ派
  • 関数型というのは純粋関数型のことだよ派
  • モナディックな表示的意味論を持つ言語だよ派

Page 14

日本人も漢字使ってるし中国語読めるでしょ?

Page 15

関数型得意だしLisp書けるでしょ?

Page 16

いやいや…

厳しい…

Page 17

それくらい「関数型」アプローチは多様

Page 18

Lispで「関数プログラミング」してますか?

Page 19

Lisp族の中ですら言語(方言)ごとに文化が違う

Page 20

みなさんはLispをご存じですか

Page 21

出典: フリー百科事典『ウィキペディア(Wikipedia)』 関数型プログラミング より引用

Page 22

1958年登場の言語

(現役では最古級)

Page 23

C言語

puts("foo")

Page 24

Ruby(

puts "foo"

Page 25

Lisp(

(puts "foo")

Page 26

(imaginary)

(((((LISP)))))

Page 27

(((カッコが多い)))

Page 28

カッコだらけの構文 (S式)

  • (a b c) のように並べたリストを構文の基本単位とする
  • 式と文の区別はない。全てが式。
  • このリストによるコードをS-expressionと呼ぶ
  • 日本語ではS式 (またはS表現とも)
  • Lisp族の言語の構文に基礎であるほか、

WebAssembly テキスト形式 (.wat) でも採用されている

Page 29

結構ひとによって印象が違う言語だと思う

Page 30

Page 31

Page 32

Page 33

Page 34

(Lispって結局何-p)

Page 35

虚実に包まれたLisp

Page 36

ということで

Page 37

Page 38

関数型言語

(じゃないの!??)

Page 39

話をきいてください

Page 40

そもそも関数型ってなんだ

Page 41

「関数型」と呼んだのはジョンバッカス(1977年)

Page 42

“Can programming be liberated from the von Neumann style?: a functional style and its algebra of programs: Communications of the ACM: Vol 21, No 8”より引用

Page 43

combinatory logic

コンビネータ論理

(1929年-)

Page 44

λ-calculus

ラムダ計算

(1930年代-)

Page 45

Page 46

(λ計算)

λx.λy.x

Page 47

(Haskell)

λx.λy.x

\x -> \y => \x

(const)

Page 48

(JavaScript)

λx.λy.x

x => y => x

Page 49

(太古のJavaScript)

λx.λy.x

function (x) {

return function (y) {

return x;

};

};

Page 50

(PHP)

λx.λy.x

fn($x) => fn($y) => $x

Page 51

単純型なしλ計算はチューリング完全であることが知られている

Page 52

関数と適用しかないが工夫して制御構造もデータ構造も作れる

Page 53

こういう積み重ねで現代の関数型っぽい要素が整理された

Page 54

レキシカルスコープとか不変性とかカリー化とか型推論とか代数的データ型とか遅延評価とかモナドとか関数合成とか参照透過とか

Page 55

で、Lispはどういう関数型言語なの?

Page 56

λ関数型言語とはλ (私の偏見に基く認識)

C言語

Python

Lisp

動的/静的の壁

ML系

Haskell

  • 関数定義ができれば関数型言語だよ派
  • ファーストクラスの関数抽象があれば関数型言語だよ派
  • 標準ライブラリで高階関数(map/reduce)が扱えればいいよ派
  • 代数的データ型が扱えない言語は関数型言語じゃないよ派
  • 型推論の完全性がある静的型付き言語が関数型だよ派
  • 関数型というのは純粋関数型のことだよ派
  • モナディックな表示的意味論を持つ言語だよ派

Page 57

関数型的な主観だけで比較してしまうとLispとPHPは同等

Page 58

Lispは関数型言語

ではない

Lisp is NOT a functional language

pixiv Inc.

USAMI Kenta

2025-06-15 #fp_matsuri

関数型まつり 2025

Page 59

λ-calculus

ラムダ計算

(1930年代-)

Page 60

LISPはラムダ計算の実装ではない

Page 61

(すくなくとも初期は)

Page 62

Page 63

Page 64

Page 65

Page 66

LISPと変数スコープ

  • 初期のLISP(LISP1〜MACLISP)は変数スコープの概念が未確立
  • レキシカルスコープかダイナミックスコープかが定かではない(!)

FUNARG問題

  • 1975年に登場したSchemeではクロージャ(レキシカルスコープ)が導入
  • 1984年に登場したCommon Lispはレキシカルスコープが基本だが、

スペシャル変数として定義することでダイナミックスコープも使える

Page 67

Page 68

(PHP)

λx.λy.x

fn($x) => fn($y) => $x

Page 69

(Scheme)

λx.λy.x

(lambda (x)

(lambda (y)

x))

Page 70

(Racket)

λx.λy.x

(λ (x) (λ(y) x))

Page 71

Lispでもラムダ計算できるが書きやすくはない

Page 72

関数の純粋性を担保する仕組みが不足している

Page 73

とはいえ関数プログラミングの道具は揃っている

Page 74

その道具をどう使うかによってLispの文化がある

Page 75

LISPとLisp系言語

  • 「方言」と呼ばれるが、C言語とC#とJavaとJavaScriptくらい違う
  • Scheme:

比較的シンプルな言語仕様と衛生的マクロ

  • Common Lisp: 機能豊富で処理系も多い
  • Clojure:

関数型重視でJVMで動く。Rich Hickeyの哲学

  • Emacs Lisp:

GNU Emacsで動く。Emacsそのもの

Page 76

Page 77

機能的にはどのLispでも他のスタイルで書ける

Page 78

Page 79

Page 80

Page 81

「初めての人のためのLISP [増補改訂版]」 より引用竹内郁雄著, 2010年3月9日 初版第1刷発行, 翔泳社刊(電子書籍版を底本とする)

Page 82

Lispは関数型言語ではないが能力と文化によって実現している

Page 83

_人人人人人人人_> Lispは雑草 <‾Y^Y^Y^Y^Y^‾

Page 84

Emacs Lisp

広く普及したLispでありながらLispらしくないと敬遠された

Page 85

Page 86

Page 87

Emacs Lispの弱点

  • クロージャと真正のレキシカルスコープがなかった
  • マクロで擬似的に再現したレキシカルスコープはあった
  • 末尾再帰最適化がない
  • カジュアルに副作用がある
  • 名前空間 (パッケージ) がない
  • リーダーマクロがない
  • Emacsと密結合している

Page 88

Emacs Lisp (elisp)

  • Richard Stallman (RMS)のこだわりのLisp方言
  • RMSが最近も機能追加しようとしている
  • 現存するメジャーな方言ではCommon Lisp寄りではあるが結構違う
  • Lisp Machine LispやGosling MLispの影響がある
  • Common Lisp風の機能はcl-libという標準ライブラリで同梱

Page 89

Emacs

  • Lispを内蔵したエディタというべきか、

言語処理系にエディタ機能がついているべきか

  • init.el というファイルにLispで設定を書くが、

初期化設定とEmacsで動かす機能の開発には境目がまったくない

  • Lispが動く仮想的なLispマシンそのもの
  • Evilという互換性が極めて高いVimインターフェイスが実装されている

Page 90

Emacs Lispの弱点

  • クロージャと真正のレキシカルスコープがなかった
  • マクロで擬似的に再現したレキシカルスコープはあった
  • 末尾再帰最適化がない
  • カジュアルに副作用がある
  • 名前空間 (パッケージ) がない
  • リーダーマクロがない
  • Emacsと密結合している

Page 91

Page 92

  • Emacsの検索には副作用があるが -p のついた述語関数で避けられる
  • (declare (side-effect-free t)) で純粋関数としてマークできる

Page 93

Emacs Lisp

かつては不出来な末っ子扱い現在は必死に追い上げている

Page 94

Lispはマルチパラダイム

Page 95

Lisp Machine

AIブームを牽引した専用機(1970年代後半-)

Page 96

そういう機械が40年以上前にあった

Page 97

「Multi-Paradigm Language TAO」より引用https://www.nue.org/nue/tao/bitao/s001.html

Page 98

この写真は国産LISPマシンのELISなので本家Emacsの開発経緯とは直接関係ないのだが内蔵されたZENというEmacs風独自エディタの日本語入力メソッドKanzenが後のSKKに繋がりIME史に影響を及ぼしている

Page 99

Page 100

Page 101

Page 102

TAO/ELISの特徴は現代Lispには受け継がれていない

Page 103

どのLispも多かれ少なかれマルチパラダイム

Page 104

Lispは関数型の枠に留まっていない

Page 105

Lispのパワーの根源はS式・マクロ

Page 106

Page 107

Page 108

Page 109

Lisp一族の雑草のような生命力にご期待ください!