Skip to content

Lispは関数型言語

公開日:

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
    標準ライブラリで高階関数(map/reduce)が扱えればいいよ派
  • 動的/静的の壁
    代数的データ型が扱えない言語は関数型言語じゃないよ派
  • 型推論の完全性がある静的型付き言語が関数型だよ派

ML系

  • 関数型というのは純粋関数型のことだよ派

Haskell

  • モナディックな表示的意味論を持つ言語だよ派

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

λx.λy.x

(太古のJavaScript)

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
    標準ライブラリで高階関数(map/reduce)が扱えればいいよ派
  • 動的/静的の壁
    代数的データ型が扱えない言語は関数型言語じゃないよ派
  • 型推論の完全性がある静的型付き言語が関数型だよ派

ML系

  • 関数型というのは純粋関数型のことだよ派

Haskell

  • モナディックな表示的意味論を持つ言語だよ派

Page 57

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

Page 58

Lispは関数型言語
ではない

NOT

Lisp is 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一族の
雑草のような生命力に
ご期待ください!