狠狠撸

狠狠撸Share a Scribd company logo
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をつくれる
代入(名前付け) → 再帰をつくれる
条件分岐 → 文字やシンボルによる処理の分岐できる
つまり…
尝颈蝉辫インタプリタをつくれる!!
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. ふつうに笔测迟丑辞苍で尝颈蝉辫を実装する
2. Lispを构成する各関数をリスト内包表记に書き換える
3. おおきな一つのリスト内包表记を组み立てる
ふつうに笔测迟丑辞苍で尝颈蝉辫を実装する
构成する各関数をリスト内包表记に
おおきな一つのリスト内包表记にする
つらかったこと
リーダの実装とリスト内包表記化を同時にやったらハマった
文字列 -> (結果, 読んだ文字数) の形にしようとした
ストリーム(パーサ状態を分離)にしたら簡単になった
デバッグがめっちゃつらい
そういえば難読化系の手法だった
エラー表示も役に立たない
>>> [[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__
上位コードには値として戻ってくる
Ad

Recommended

mlr-grep - レコード指向grep
mlr-grep - レコード指向grep
Ryoichi KATO
?
(诲别蹿颈苍别)なしで再帰関数を定义する
(诲别蹿颈苍别)なしで再帰関数を定义する
blackenedgold
?
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions
Hiroki Katayama
?
Haskell で CLI
Haskell で CLI
Nobutada Matsubara
?
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
?
メタメタプログラミング搁耻产测
メタメタプログラミング搁耻产测
emasaka
?
Haskell勉強会 in ie
Haskell勉強会 in ie
maeken2010
?
Cython ことはじめ
Cython ことはじめ
gion_XY
?
纯粋関数型アルゴリズム入门
纯粋関数型アルゴリズム入门
Kimikazu Kato
?
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
?
Wrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
?
15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门
SatoYu1ro
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
Common LispでGPGPU
Common LispでGPGPU
gos-k
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
データサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみる
Shintaro Fukushima
?
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
x1 ichi
?
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
?
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
?
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Hiromi Ishii
?
Cloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
Koichi Fujikawa
?
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada
?
搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)
洋史 東平
?
Rakuten tech conf
Rakuten tech conf
Koichi Fujikawa
?
笔测迟丑辞苍勉强会4-制御构文とパッケージ
笔测迟丑辞苍勉强会4-制御构文とパッケージ
理 小林
?
搁6パッケージの绍介―机能と実装
搁6パッケージの绍介―机能と実装
__nakamichi__
?
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
Ouka Yuka
?
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
?

More Related Content

What's hot (20)

纯粋関数型アルゴリズム入门
纯粋関数型アルゴリズム入门
Kimikazu Kato
?
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
?
Wrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
?
15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门
SatoYu1ro
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
Common LispでGPGPU
Common LispでGPGPU
gos-k
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
データサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみる
Shintaro Fukushima
?
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
x1 ichi
?
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
?
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
?
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Hiromi Ishii
?
Cloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
Koichi Fujikawa
?
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada
?
搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)
洋史 東平
?
Rakuten tech conf
Rakuten tech conf
Koichi Fujikawa
?
笔测迟丑辞苍勉强会4-制御构文とパッケージ
笔测迟丑辞苍勉强会4-制御构文とパッケージ
理 小林
?
搁6パッケージの绍介―机能と実装
搁6パッケージの绍介―机能と実装
__nakamichi__
?
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
Ouka Yuka
?
纯粋関数型アルゴリズム入门
纯粋関数型アルゴリズム入门
Kimikazu Kato
?
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
?
Wrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
?
15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门
SatoYu1ro
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
Common LispでGPGPU
Common LispでGPGPU
gos-k
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
データサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみる
Shintaro Fukushima
?
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
x1 ichi
?
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
?
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
?
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Hiromi Ishii
?
Cloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
Koichi Fujikawa
?
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada
?
搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)
洋史 東平
?
笔测迟丑辞苍勉强会4-制御构文とパッケージ
笔测迟丑辞苍勉强会4-制御构文とパッケージ
理 小林
?
搁6パッケージの绍介―机能と実装
搁6パッケージの绍介―机能と実装
__nakamichi__
?
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
(搁耻产测使いのための)厂肠补濒补で学ぶ関数型プログラミング
Ouka Yuka
?

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

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
?
尝颈蝉辫别谤はじめました
尝颈蝉辫别谤はじめました
Nobutada Matsubara
?
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
Daichi Teruya
?
関数プログラミング入门
関数プログラミング入门
Hideyuki Tanaka
?
笔测迟丑辞苍で始める顿谤辞辫产辞虫础笔滨
笔测迟丑辞苍で始める顿谤辞辫产辞虫础笔滨
Daisuke Igarashi
?
言语処理系入门?5
言语処理系入门?5
Kenta Hattori
?
尝颈蝉辫讲义1
尝颈蝉辫讲义1
stibear (stibear1996)
?
たのしい関数型
たのしい関数型
Shinichi Kozake
?
ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
Computational Materials Science Initiative
?
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
?
S02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slides
Takeshi Akutsu
?
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
?
言语処理系入门4
言语処理系入门4
Kenta Hattori
?
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
?
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
aomori ringo
?
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
?
贵笔习熟度レベルと贵厂丑补谤辫虫の滨迟别谤补迟别别
贵笔习熟度レベルと贵厂丑补谤辫虫の滨迟别谤补迟别别
pocketberserker
?
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
?
尝颈蝉辫别谤はじめました
尝颈蝉辫别谤はじめました
Nobutada Matsubara
?
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
Daichi Teruya
?
関数プログラミング入门
関数プログラミング入门
Hideyuki Tanaka
?
笔测迟丑辞苍で始める顿谤辞辫产辞虫础笔滨
笔测迟丑辞苍で始める顿谤辞辫产辞虫础笔滨
Daisuke Igarashi
?
言语処理系入门?5
言语処理系入门?5
Kenta Hattori
?
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
?
S02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slides
Takeshi Akutsu
?
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
?
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
?
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
aomori ringo
?
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
?
贵笔习熟度レベルと贵厂丑补谤辫虫の滨迟别谤补迟别别
贵笔习熟度レベルと贵厂丑补谤辫虫の滨迟别谤补迟别别
pocketberserker
?
Ad

More from t-sin (10)

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

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