SlideShare a Scribd company logo
1 of 37
Download to read offline
PythonでLispを実装した
2018-05-31, lisp meetup #64
導入
Pythonのリスト内包表記は便利なものです
便利すぎて、チューリング完全らしいです
出典: リスト内包表記の活用と悪用
Pythonのリスト内包表記で実装されたBrainfxxkインタプリタ
チューリング完全なもの
チューリングマシン
ラムダ計算
再帰関数
純Lisp
C++のテンプレート
Javaのジェネリクス
jq (JSON整形コマンド)
スーパーマリオメーカー
Pythonのリスト内包表記 ← new!
チューリング完全ならば
Pythonのリスト内包表記から
(brainfxxkなんてチャチなものではなく)
純Lispを生やすことができるのでは…??
——実際にやってみた
リスト内包表記でできること
リスト上のイテレーション&収集 = mapcar
リスト要素によるフィルタ = remove-if
リスト内包表記でできること
リスト上のイテレーション&収集
リスト要素によるフィルタ
順次処理 (new!)
代入 (new!)
処理の分岐 (new!)
無限ループ (new!)
リスト内包表記で順次処理
or や and の短絡評価を利用する
# printの返り値はNone
>>> [print("hello") or print("bye") for n in [None]]
hello
bye
[None]
値がある関数の場合は…
>>> [(str(42) and None) or print('hi') for n in [None]]
hi
[None]
リスト内包表記で代入
リストのリストを操作する場合、 n によって空リストを参照可能
>>> [lis.append(n) or lis for n in range(3)
... for lis in [[]]]
[[0], [1], [2]]
ちなみにこのforを逆にすると、こうなる
>>> [lis.append(n) or lis for lis in [[]]
... for n in range(3)]
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
内側の for が外側のループのローカル変数になるっぽい
lambda 式を代入(名前付け)することで、再帰できます
リスト内包表記で条件分岐
いくつか方法がある:
>>> [print(n) for n in range(3) if n % 2 == 0]
0
2
[None, None]
>>> [print(n) if n % 2 == 0 else 'w' for n in range(3)]
0
2
[None, 'w', None]
後者のほうが、複数の if を連ねて switch するのに便利
リスト内包表記で(無限)ループ
リスト内包表記のイテレーション対象は
実はループ内で更新できるのだ!!!!
>>> [e.append(None) for lis in [[None]] for e in lis]
for e in lis で lis の中のリストをイテレートしているのに、
e.append(None) でイテーレション対象が増えていく…!!
これらを応用すると…
無限ループ → REPLをつくれる
代入(名前付け) → 再帰をつくれる
条件分岐 → 文字やシンボルによる処理の分岐できる
つまり…
Lispインタプリタをつくれる!!
LISC
LISP = LISt Proccessing
LISC = LISt Comprehension
https://github.com/t-sin/lisc/blob/master/lisc.py
LISC (コード)
[[b.append(l_read(_make_stream(input('> ')))) or
(print(l_print(l_eval(b[-1], _env))) if b[-1] is not None else
b.append('')) for b in [[None]] for a in b] for _read_char in
[lambda stream: [(stream.pop() and None) or
stream.append(-1) or (None, stream) if pos >= len(stream[0])
else (None, stream) if pos == -1 else c.append(stream[0][pos])
or (stream.pop() and None) or stream.append(pos+1) or (c[0],
stream) for c in [[]] for pos in [stream[1]]][0]] for _peek_char in
[lambda stream: [(None, stream) if pos >= len(stream[0]) else
(None, stream) if pos == -1 else (stream[0][pos], stream) for
pos in [stream[1]]][0]] for _make_stream in [lambda s: [s, 0]]
for _read_list in [lambda stream: [[(_read_char(stream) and
None) or loop[1:] if _peek_char(stream)[0] == ')' else loop[1:] if
_peek_char(stream)[0] == None else loop.a ...
以下省略
構成のしかた
1. ふつうにPythonでLispを実装する
2. Lispを構成する各関数をリスト内包表記に書き換える
3. おおきな一つのリスト内包表記を組み立てる
ふつうにPythonでLispを実装する
構成する各関数をリスト内包表記に
おおきな一つのリスト内包表記にする
つらかったこと
リーダの実装とリスト内包表記化を同時にやったらハマった
文字列 -> (結果, 読んだ文字数) の形にしようとした
ストリーム(パーサ状態を分離)にしたら簡単になった
デバッグがめっちゃつらい
そういえば難読化系の手法だった
エラー表示も役に立たない
>>> [[b.append(l_read(_make_stream(input('> ')))) or
(print(l_print(l_eval(b[-1], _env))) if b[-1] is not None
else b.append('')) for b in [[None]] for a in b] for _read_cha
in [lambda stream: [(stream.pop() and None) or stream.append(
...
^ # これはどこを指しているんだ
まとめ
Pythonのリスト内包表記で純Lispできた
純Lispに絞れば、わりと簡単に実装できる
リスト内包表記は用法・用量を守って正しく使いましょう
ところで、純Lispって…
コンスっぽいもの
atom , eq , car , cdr , cons の関数
if , quote , lambda , define の特殊形式
これらによって eval を構成できる
…とされる(Wikipedia調べ)
あれLISC…、 eval は…?
eval は、ないの??
ないの???????
PythonでLispを実装したので
evalも実装した
2018-05-31, lisp meetup #64
導入
とりあえず純Lispを実装してみたものの、
eval がない
あるもの:
コンスっぽいもの
atom , eq , car , cdr , cons の関数
if , quote , lambda , define の特殊形式
ほんとうにこれだけで eval 実装できるのか?
——実際にやってみた
手元にある道具
コンスっぽいもの
atom , eq , car , cdr , cons の関数
if , quote , lambda , define の特殊形式
eval がほしいというつよいきもち (new!)
生えてきてほしいもの
環境
lambda でも作られるため、入れ子にできる必要あり
環境に対する操作:検索、更新
基本関数&関数オブジェクト
環境の中に定義する
ホスト言語のものを流用する
評価器本体
特殊形式を気合で実装する
cond はないため if で…
環境
(親環境 値マップ) という形式にする
コンスセルを使ってハッシュテーブル的な構造が必要
ここでは連想リスト(alist)を作る
(_assoc name alist) : alist内の name の値を返す
(_update alist name val) : 指定したキーの値を更新した
alistを返す
assoc のコード
(define _assoc
(lambda (item lis)
(if (eq lis nil)
nil
(if (eq (car (car lis)) item)
(car lis)
(_assoc item (cdr lis))))))
基本関数
関数オブジェクトは (:lambda: 引数リスト 本体コード) にした
環境の操作関数を用いて、組み立てる
(_setv name val) : グローバル環境へ代入
(_loopup name env) : 環境内を再帰的に検索
たとえば…
cons のコード
(_setv
(quote cons)
(cons (quote :lambda:)
(cons (quote (a b))
(cons (lambda (ne)
(cons (_lookup (quote a) ne)
(_lookup (quote b) ne)))
nil))))
評価器本体 eval
式 と 現在の環境 をとって、それを評価した値を返す
引数の 式 の種類で場合分け
cond がないのでネストが深くなっても負けない、泣かない
たとえば…
アトムだったら:
nil だったら nil を返す
それ以外だったら:
環境から値を探して返す
環境に値がなかったら、 :unbound: を返す
というふうにする。
これが eval だ!!!
(lambda (form env)
(if (atom form)
(if (eq form nil)
nil
(if (eq form t)
form
(_lookup form env)))
(if (eq (cdr form) nil)
nil
(if (eq (car form) (quote if))
(if (_eval (car (cdr form)) env)
(_eval (car (cdr (cdr form))) env)
(_eval (car (cdr (cdr (cdr form)))) env))
(if (eq (car form) (quote quote))
(car (cdr form))
(if (eq (car form) (quote lambda))
(cons (quote :lambda:)
(cons (car (cdr form))
(cons (lambda (ne) (_eval
(if (eq (car form) (quote define))
(_setv (car (cdr form)) (_eval
((lambda (fn)
(if (eq fn (quote :unbound
(quote :undefined-op:)
((car (cdr (cdr fn))) (
(_lookup (car form) env))))))))))
関数オブジェクトの部分
関数オブジェクトの構造は (:lambda: 引数 本体)
愚直に cons でつくってる
本体はホスト言語の関数
指定された環境(evalが与える)で本体コードを評価する
;;; さっきのevalより抜粋
(if (eq (car form) (quote lambda))
(cons (quote :lambda:)
(cons (car (cdr form))
(cons (lambda (ne)
(_eval (car (cdr (cdr form))) ne))
nil)))
...
関数呼び出しの部分
_lookup で値を取ってくる(最後の行)
:unbound: だったら、未定義なのでエラー値を返す
そうでなかったら、
関数の引数より新しい環境を作り ( _bind のあたり)、
本体関数にそれを渡して呼び出す
;;; さっきのevalより抜粋
((lambda (fn)
(if (eq fn (quote :unbound:))
(quote :undefined-op:)
((car (cdr (cdr fn)))
(cons env (cons (_bind (car (cdr fn))
(cdr form) env) nil)))))
(_lookup (car form) env))))))))))
まとめ
純Lispから eval を導出できた
Lispを実装するときのアドバイス
progn を実装しておくとよい
print を実装しておくとよい
エラー機構をちゃんとしとくとカッコいい
(おまけ)妥協点
LISCおよびにその上のLISPは、簡略化のためめんどくさいため
以下の設計上の選択妥協をした
リストはPythonのリストに対応させる
つまり、コンスセルなし
(hoge . fuga) はつくれない
エラー処理は変な値を返すだけ
未束縛シンボル: __unbound_variable__
上位コードには値として戻ってくる

More Related Content

What's hot

純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPUgos-k
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたってTsuyoshi Matsudate
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsHiromi Ishii
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by HapyrusKoichi Fujikawa
 
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会Takeshi Okada
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)洋史 東平
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ理 小林
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装__nakamichi__
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 

What's hot (20)

純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
 
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
 
前期講座09
前期講座09前期講座09
前期講座09
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 

Similar to PythonでLispを実装した (evalつき)

Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Material
MaterialMaterial
Material_TUNE_
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISPMasaomi CHIBA
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる5t111111
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門kamukiriri
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_distShohei Hido
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Shintaro Fukushima
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
データとは何か
データとは何かデータとは何か
データとは何かKenta Suzuki
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Etsuji Nakai
 

Similar to PythonでLispを実装した (evalつき) (20)

たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Material
MaterialMaterial
Material
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Python opt
Python optPython opt
Python opt
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
データとは何か
データとは何かデータとは何か
データとは何か
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 

More from t-sin

続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシンt-sin
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてt-sin
 
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったt-sin
 
Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっていますt-sin
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングt-sin
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装したt-sin
 
バッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使うバッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使うt-sin
 
Common lispでグラフィックアート
Common lispでグラフィックアートCommon lispでグラフィックアート
Common lispでグラフィックアートt-sin
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたいt-sin
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-t-sin
 

More from t-sin (10)

続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
 
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
 
Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっています
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
 
バッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使うバッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使う
 
Common lispでグラフィックアート
Common lispでグラフィックアートCommon lispでグラフィックアート
Common lispでグラフィックアート
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-
 

PythonでLispを実装した (evalつき)