Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Common Lisp ユーザへのScheme紹介

1 094 vues

Publié le

Common Lisp を知っている人に、Schemeを軽く紹介

Publié dans : Technologie
  • Identifiez-vous pour voir les commentaires

  • Soyez le premier à aimer ceci

Common Lisp ユーザへのScheme紹介

  1. 1. Common Lisper向けの Scheme紹介 2018.JUN.23 たけおか@AXE/たけおかラボ @takeoka
  2. 2. たけおか 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) (買ってません (^^; )
  3. 3. ● Scheme を知らない人 向け 紹介 目次 ● funcall かっこわるい ● schemeには、遅延評価がある ● schemeには、継続がある
  4. 4. funcall かっこわるい ● schemeは、関数定義するとクロージャ(関数閉包)ができ る ● クロージャに 実引数を適用するのに、なにも要らない – CLは、funcall とか apply とか eval とかが必要
  5. 5. Common Lisp * (funcall #'cdr '(a s d)) (S D) 関数さまは、 明示して 呼び出して 差し上げる なんだ? この記号わ? function の省略形
  6. 6. 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は 楽しくない ←いいね
  7. 7. schemeでは、関数が第一級オブジェクト ● クロージャに 実引数を適用するのに、なにも要らない ● schemeは 関数(定義)が別の名前空間ではない – フツーの変数に、関数(クロージャ)が保持される ● 関数が、1st class object (第一級オブジェクト) ● 一級オブジェクトとは、フツーのデータとして扱えるもの – schemeのクロージャは、変数に入れたり、引数として渡せる ● CommonLispは、関数定義の名前空間が別 – defun すると、特別な名前空間で管理される – funcallなどで呼び出し
  8. 8. delay/force ● schemeには、遅延評価がある ● 遅延された 計算は promise と呼ぶ
  9. 9. 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 ←評価は一回だけしか行われない ←遅延オブジェクト
  10. 10. continuation 継続 ● schemeには、continuation 「継続」がある ● 大域脱出 (catch/throw, setjmp/longjmp) に使う ● 継続は、スレッド実体と同じもの ● コルーチン/スレッドとして扱える ● (スレッド)スケジューラは居ない – 自スレッドの休止 & 他スレッド 起床 を自分で行う = コルーチン – continuation passing ● ※最適化 手法(CPS変換)のことではない ● UNIXマガジン 1991.JAN に同様の記事を書いたよ – ruby のまつもとゆきひろ氏も、読んでいた.rubyには最初から継続が ある
  11. 11. call/cc (call-with-current-continuation bar) ● call-with-current-continuationは、呼び出し時の継続 を生成して、それを引数として、ここではbarを評価する ● この例では、bar を呼び出す ● barの引数に 継続が渡される ● barに渡された継続を評価すると、 call/cc した人の処理を再開する ● call-with-current-continuationは、しばしば call/cc という省略形が使われる
  12. 12. 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再開
  13. 13. 超絶おまけ 神戸大 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マシンの話をして頂くとか
  14. 14. 以上

×