Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Before LISPs Just Part of the Past ~#13 Reader pub~

460 views

Published on

Slides in Lisp Meet Up #27.

Published in: Technology
  • Be the first to comment

Before LISPs Just Part of the Past ~#13 Reader pub~

  1. 1. Before LISPs Just Part of the Past 〜 #13 reader 〜
  2. 2. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 ()
  3. 3. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 alphabetic[2]なConstituent Symbol Tokenの構築を開始 ()
  4. 4. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 alphabetic[2]なConstituent Symbol Tokenの要素 ()
  5. 5. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 alphabetic[2]なConstituent Symbol Tokenの要素 ()
  6. 6. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 alphabetic[2]なConstituent Symbol Tokenの要素 ()
  7. 7. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 alphadigitなConstituent Symbol Tokenの要素 ()
  8. 8. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 whitespace[2] Tokenの区切り (PRIN1)
  9. 9. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする (PRIN1)
  10. 10. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする (PRIN1) () Macro Character READを用いたList構築
  11. 11. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする Single Escape: 次の文字を alphabetic[2]なConstituentにする (PRIN1) () Macro Character READを用いたList構築
  12. 12. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする alphabetic[2]なConstituent Symbol Tokenの構築を開始 (PRIN1) () Macro Character READを用いたList構築
  13. 13. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする alphabetic[2]なConstituent Symbol Tokenの要素 (PRIN1) () Macro Character READを用いたList構築
  14. 14. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする Macro Character READを用いたList構築 whitespace[2]: Tokenの区切り (PRIN1) (| X|)
  15. 15. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする Macro Character READを用いたList構築 alphabetic[2]なConstituent Symbol Tokenの構築を開始 (PRIN1) (| X|)
  16. 16. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Macro Character READの返した値をQUOTEする Macro Character READを用いたList構築 Listの終端 (PRIN1) (| X| Y)
  17. 17. readerことはじめ )( p r i n 1 ' ( x y ) Macro Character: 設定された関数を呼び出す READを用いたList構築 Listの終端 (PRIN1 (QUOTE (| X| Y))
  18. 18. Motivation 区切りとして 機能する文字は?
  19. 19. Motivation 入力 しちゃいけない 文字は?
  20. 20. Motivation Symbolにアクセスする 方法のすべては?
  21. 21. Syntax Types ● macro character ● constituent ● single escape, multiple escape ● whitespace[2] ● invalid
  22. 22. Macro Character ● READ中に発見されると関数が呼び出される ● Terminating – Tokenの区切り文字になる – ex) x'y ● Non-Terminating – Token構築中に発見されるとConstituent – ex) x#y
  23. 23. Constituent ● Tokenの構成要素 – symbolと数 ● READ中に発見されるとTokenの構築を開始 する ● Token構築中に発見された場合の振る舞いは Constituent Traitで決まる
  24. 24. Constituent Traits ● alphabetic[2] ● dot ● package marker ● invalid ● alphadigit ● digit ● plus sign ● minus sign ● decimal point ● ratio marker ● exponent marker
  25. 25. Constituent Traits ● alphabetic[2] ● dot ● package marker ● invalid ● alphadigit ● digit ● plus sign ● minus sign ● decimal point ● ratio marker ● exponent marker 数 ト ー ク ン に 使 用
  26. 26. Constituent Traits ● alphabetic[2] ● dot ● package marker ● invalid ● alphadigit ● digit ● plus sign ● minus sign ● decimal point ● ratio marker ● exponent markerreader macroで 再現できない
  27. 27. Escape ● Traitがalphabetic[2]であるような Constituent Characterに変更する ● caseの変更を抑止 ● 'x y ; => X Y ● '|x y| ; => |x y| ● Reader macroでは再現できない
  28. 28. whitespace[2] ● 区切り文字の一種 – Token構築中ならTokenの区切り – それ以外なら単に無視される ● Terminating Macro Characterとして 実装可能 (set-macro-character #$ (lambda (stream c) (values)))
  29. 29. invalid ● READ中に出現するとエラー – (read-from-string (string #Rubout)) ; Error – (char (symbol-name (read-from-string (concatenate 'string "x" (string #Rubout)))) 1) ; => #Rubout – (set-macro-character #Space #'identity t) – (read-from-string "a b") ; Error ● Terminating Macro Characterとして実装可能 ● (set-macro-character #$ (lambda (stream n) (error 'reader-error :stream stream))
  30. 30. もっとreader macroを ● 文字列からsource codeを構築する際の問題は reader macroで対処すべき – INTERNが早すぎるとか – read中にreaderの挙動を変えたいとか ● *READ-BASE* ● *READTABLE* ● *PACKAGE* ● etc.
  31. 31. 名前の使用を制限する ● (defparameter *sandbox* (copy-readtable nil)) – (copy-readtable)は不適切 ● (set-macro-character #: (lambda (stream c) (values)) nil *sandbox*) ● (defpackage :void) ● (let ((*package* (find-package :void)) (*readtable* *sandbox*)) (eval (read stream)))
  32. 32. INTERNしないREAD ● Tokenの代わりにその元になる文字列を返す – cf) *READ-SUPRRESS* ● (read (subread stream)) == (read stream) ● 区切り文字 – whitespace[2] ● #Tab, #Newline, #Linefeed, #Page, #Return, #Space – Terminating Macro Character – (invalid) ● Terminating Macro Characterを効率的に列挙する方法が必要 – 特にBASE-CHAR以外の文字
  33. 33. Mismatches ● Syntax TypeおよびConstituent Traitの自由な変更 – (sb-impl::set-cat-entry #$ sb-impl::+char-attr-whitespace+ *sandbox*) – SBCLでは、Syntax TypeとConstituent Traitはどちらも Character attribute – SET-CAT-ENTRYはBASE-CHAR以外はグローバルに変更する ● alphadigitはpredecessorを指定する
  34. 34. Mismatches ● reader macroでの読み込み履歴へのアクセス – package markerやEscapeなど、マクロ文字が実装できる ● Syntax typeのinvalid – Constituentとすべき ● Constituent Traitのalphadigit – digit, alphabeticで良いのでは – Tokenの読み込み開始時に決定しているかどうかで分けているの かも
  35. 35. misc ● cl-user::(print 1) – SBCL拡張 ● 外から来たファイルをREAD-EVALしたい ならもうちょっと考察がいる – #.の抑制、NILの扱い、など

×