SlideShare a Scribd company logo
2
Most read
4
Most read
6
Most read
Common Lisper向けの
Scheme紹介
2018.JUN.23
たけおか@AXE/たけおかラボ
@takeoka
たけおか
1977年(高校2年生): MITのJames Slagleの書いたAIの教科書(日本語版)を読んで
「○×」を打つプログラムを8bitマイコンTK-80(8080,RAM 512Bytes)の機械語で書く
1980年代: UNIXの仮名漢字変換システムWnnや Temporal Prolog(時相論理Prolog)を京
大数解研の地下辺りで作ったり。渋谷や神保町辺りで国産X Window端末などの設計開
発に携わる。TCP/IPスタックを自分で書く
1987年ごろ、湯淺さんにSchemeを教えてもらった
1990年代初頭:豊橋技科大 湯淺研にて、1024PE規模の超並列計算機“SM-1”のLSIハード
ウェア、基本ソフトウェアの設計開発に携わる。
Common Lispで開発ツール書いた。
当時、超並列計算機は、ニューラルネットのシミュレーションによく使用された
現在: 組み込みOSを作らせたり、AI開発
湯淺研 SM-1 フロントエンドはSparc
開発環境はCommon LispとC
萩谷さんに貰った
(サインはしてくれない)
湯淺さんのScheme本
岩波書店 (1991/10/29)
(買ってません (^^; )
●
Scheme を知らない人 向け 紹介
目次
●
funcall かっこわるい
●
schemeには、遅延評価がある
●
schemeには、継続がある
funcall かっこわるい
●
schemeは、関数定義するとクロージャ(関数閉包)ができ
る
●
クロージャに 実引数を適用するのに、なにも要らない
– CLは、funcall とか apply とか eval とかが必要
Common Lisp
* (funcall #'cdr '(a s d))
(S D)
関数さまは、
明示して
呼び出して
差し上げる
なんだ?
この記号わ?
function の省略形
funcall かっこわるい
(defvar baka)
BAKA
* (setq baka
(let ((sum 0))
(lambda (x) (incf sum x))))
#<CLOSURE (LAMBDA (X))
{100219D05B}>
* (funcall baka 2)
2
* (funcall baka 2)
4
*
> (define aaa nil)
#<unspecified>
> (set! aaa
(let ((sum 0))
(lambda (x) (let()(set! sum (+ sum x)) sum))))
#<unspecified>
> aaa
#<CLOSURE <anon> (x) (#@begin (#@set!
#@sum (#@+ #@sum #@x)) #@sum)>
> (aaa 1)
1
> (aaa 1)
2
> (aaa 1)
3
Common Lisp Scheme (scm)
←funcallは
楽しくない
←いいね
schemeでは、関数が第一級オブジェクト
●
クロージャに 実引数を適用するのに、なにも要らない
●
schemeは 関数(定義)が別の名前空間ではない
– フツーの変数に、関数(クロージャ)が保持される
●
関数が、1st class object (第一級オブジェクト)
●
一級オブジェクトとは、フツーのデータとして扱えるもの
– schemeのクロージャは、変数に入れたり、引数として渡せる
●
CommonLispは、関数定義の名前空間が別
– defun すると、特別な名前空間で管理される
– funcallなどで呼び出し
delay/force
●
schemeには、遅延評価がある
●
遅延された 計算は promise と呼ぶ
delayとforce
> (define laz (delay (let() (print "foo")(+ 1 2))))
#<unspecified>
> laz
#<promise 3>
> (force laz)
"foo"
3
> (force laz)
3
> (force laz)
3
>(promise? laz)
#t
←評価は一回だけしか行われない
←遅延オブジェクト
continuation 継続
●
schemeには、continuation 「継続」がある
●
大域脱出 (catch/throw, setjmp/longjmp) に使う
●
継続は、スレッド実体と同じもの
●
コルーチン/スレッドとして扱える
●
(スレッド)スケジューラは居ない
– 自スレッドの休止 & 他スレッド 起床 を自分で行う
= コルーチン
– continuation passing
●
※最適化 手法(CPS変換)のことではない
●
UNIXマガジン 1991.JAN に同様の記事を書いたよ
– ruby のまつもとゆきひろ氏も、読んでいた.rubyには最初から継続が
ある
call/cc
(call-with-current-continuation bar)
●
call-with-current-continuationは、呼び出し時の継続
を生成して、それを引数として、ここではbarを評価する
●
この例では、bar を呼び出す
●
barの引数に 継続が渡される
●
barに渡された継続を評価すると、
call/cc した人の処理を再開する
●
call-with-current-continuationは、しばしば
call/cc という省略形が使われる
continuation 継続でのコルーチン
> (define (foo)
(let ((cc (call-with-current-continuation bar) ))
(do () (#f)
(display "Hello")
(set! cc (call-with-current-continuation cc)))))
#<unspecified>
> (define (bar cc)
(do ()(#f)
(display "World")
(set! cc (call-with-current-continuation cc))))
#<unspecified>
> (foo)
WorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld
HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHello
WorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld
HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHello
4) barでのcall/ccで生成された
継続が、返り値となる
↓
3) 呼び出し時に
受け取った継続を
評価し、fooを再開。
call/cc しながらなので、
fooの再開時に、barの継続が渡る
1)ここの継続を持って
barを呼び出す
2) fooからcall/ccで
呼びだされた時のfooの継続が入る
5) bar再開
超絶おまけ
神戸大 Fast Lisp(TAKITAC-7) , Lispマシン
神戸大 工学部のビルに展示されている
瀧先生が作った
1979年2月10日に完動した.
マイクロ命令サイクル300nsecのインター
プリタ
が当時の汎用大型計算機上に実装された
LISPコンパイラと同程度の速度性能を示し
た
TAKITAC-7のアーキテクチャは
後のFACOM-αとNTTのELISが継承した.
http://museum.ipsj.or.jp/computer/other/000
1.html
いつか神戸大で関西Lispをやりましょう!
瀧先生にLispマシンの話をして頂くとか
以上

More Related Content

PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PPTX
【Unity道場Houdini編】Houdini Engine とプロシージャル法
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
Unityではじめるオープンワールド入門 アーティスト編
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
PDF
BGP Unnumbered で遊んでみた
PDF
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
Unity開発で使える設計の話+Zenjectの紹介
新入社員のための大規模ゲーム開発入門 サーバサイド編
【Unity道場Houdini編】Houdini Engine とプロシージャル法
コンテナの作り方「Dockerは裏方で何をしているのか?」
Unityではじめるオープンワールド入門 アーティスト編
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
BGP Unnumbered で遊んでみた
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて

What's hot (20)

PPTX
Photonのサービス選択の勘どころ
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
CTF for ビギナーズ バイナリ講習資料
PDF
多機能ボイチャを簡単に導入する方法
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
PDF
AAをつくろう!
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PDF
UE4におけるエフェクトの基本戦略事例 後半
PDF
Lispマシン・シミュレータの紹介
PDF
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
PDF
CTF for ビギナーズ ネットワーク講習資料
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PDF
オンラインゲームの仕組みと工夫
PDF
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
KEY
やはりお前らのMVCは間違っている
Photonのサービス選択の勘どころ
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CTF for ビギナーズ バイナリ講習資料
多機能ボイチャを簡単に導入する方法
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
AAをつくろう!
ネットワーク ゲームにおけるTCPとUDPの使い分け
UE4におけるエフェクトの基本戦略事例 後半
Lispマシン・シミュレータの紹介
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
CTF for ビギナーズ ネットワーク講習資料
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
オンラインゲームの仕組みと工夫
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
やはりお前らのMVCは間違っている
Ad

Similar to Common Lisp ユーザへのScheme紹介 (20)

PDF
昔の外付けキャッシュ & コヒーレント・キャッシュ
PDF
Ichigojam ossc-170819
PDF
無脳スマートスピーカを 越えレレレのレ
PDF
フラグ色々&その遅延評価-仮想機械インタープリタ書きのための-
PDF
RISC-V User level ISA
PDF
Dataflow140711@Kernel/VM北陸1
PDF
Dataflow140711-a@Kernel/VM北陸1
PDF
What's Operating System?
PDF
[Java Day Tokyo 2018]50分で最新技術学習の基礎を身につける(SOMPO Systems Daisuke Nishino)
PDF
PDF
Lisp_chibi_machine 190427
PDF
Lispマシン ドキュメント和訳とか、 ちびLispとか
PDF
xv6 + mist32 + mruby
PDF
そういえばRとはなんだったか
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
PDF
ワークショップ「ゲーム開発チームにおけるパトレット」
PPTX
Cloudlatex講習
PPTX
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
PPTX
最小セット
昔の外付けキャッシュ & コヒーレント・キャッシュ
Ichigojam ossc-170819
無脳スマートスピーカを 越えレレレのレ
フラグ色々&その遅延評価-仮想機械インタープリタ書きのための-
RISC-V User level ISA
Dataflow140711@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
What's Operating System?
[Java Day Tokyo 2018]50分で最新技術学習の基礎を身につける(SOMPO Systems Daisuke Nishino)
Lisp_chibi_machine 190427
Lispマシン ドキュメント和訳とか、 ちびLispとか
xv6 + mist32 + mruby
そういえばRとはなんだったか
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
ワークショップ「ゲーム開発チームにおけるパトレット」
Cloudlatex講習
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
最小セット
Ad

More from たけおか しょうぞう (20)

PDF
the original SoC "ORE_SoC" with "ROS2rapper"
PDF
俺SoC (Laxer Chip, AX1001)の Prolog加速命令.New multiple branch instruction for RIS...
PDF
俺のSoC, AX1001 ができたぞー. AX1001:the SoC for edge Devices and robot modules,
PDF
Using Retro-CPU with low aspirations, No FPGA
PDF
"ros2rapper", Hardware implimentation of ROS2 communication Protocol without ...
PDF
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
PDF
SOAR:Smalltalk on RISC
PDF
俺ASICと俺CPU“松竹V(しょうちくぶい)”
PDF
あるRISC-V CPUの 浮動小数点数(異常なし)
PDF
RISC-Vの可能性
PDF
RISC-Vの可能性
PDF
どうして昔の人は八進数でしゃべるのか?
PDF
PDF
Takep lpc1114-190614
PDF
Takep lpc1114-190613
PDF
初歩的な部品の知識
PDF
PDF
Mt basic as-os_on_danbot
the original SoC "ORE_SoC" with "ROS2rapper"
俺SoC (Laxer Chip, AX1001)の Prolog加速命令.New multiple branch instruction for RIS...
俺のSoC, AX1001 ができたぞー. AX1001:the SoC for edge Devices and robot modules,
Using Retro-CPU with low aspirations, No FPGA
"ros2rapper", Hardware implimentation of ROS2 communication Protocol without ...
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
SOAR:Smalltalk on RISC
俺ASICと俺CPU“松竹V(しょうちくぶい)”
あるRISC-V CPUの 浮動小数点数(異常なし)
RISC-Vの可能性
RISC-Vの可能性
どうして昔の人は八進数でしゃべるのか?
Takep lpc1114-190614
Takep lpc1114-190613
初歩的な部品の知識
Mt basic as-os_on_danbot

Common Lisp ユーザへのScheme紹介