SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
.

.
                     M 式で生活してみる

                       小宮山 敦史

                         KITCC




    小宮山 敦史 (KITCC)     M 式で生活してみる   1/8
自己紹介



 小宮山敦史
 京都の大学院 2 回生
 twitter:komiyamb
 github:Atsushi-KOMIYAMA
      C で書いた Lisp インタプリタ
      LOL 参考にして C で書いた forth インタプリタ




 小宮山 敦史 (KITCC)        M 式で生活してみる     2/8
自己紹介



 小宮山敦史
 京都の大学院 2 回生
 twitter:komiyamb
 github:Atsushi-KOMIYAMA
      C で書いた Lisp インタプリタ
      LOL 参考にして C で書いた forth インタプリタ
 リリカル Lisp の校正とか
 Lisp ギャグ Advent Calendar のネタ 1∼2 個




 小宮山 敦史 (KITCC)        M 式で生活してみる     2/8
M式


     Lisp といえば S 式
     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))
     S 式はかっこが多くて読みにくい1




 1
     当部比
     小宮山 敦史 (KITCC)                M 式で生活してみる                        3/8
M式


     Lisp といえば S 式
     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))
     S 式はかっこが多くて読みにくい1
     かっこが少ない書き方があれば……




 1
     当部比
     小宮山 敦史 (KITCC)                M 式で生活してみる                        3/8
M式


     Lisp といえば S 式
     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))
     S 式はかっこが多くて読みにくい1
     かっこが少ない書き方があれば……
     そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい)
     fact[x] = [x=0 -> 1; T -> x∗fact[x-1]]




 1
     当部比
     小宮山 敦史 (KITCC)                M 式で生活してみる                        3/8
M式


     Lisp といえば S 式
     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))
     S 式はかっこが多くて読みにくい1
     かっこが少ない書き方があれば……
     そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい)
     fact[x] = [x=0 -> 1; T -> x∗fact[x-1]]
     Lisp1.5 のマニュアルには M 式で例が載っている
      M-expressions S-sxpressions
      car[x]        (CAR X)
      T             (QUOTE T)
      id[x]=x       (DEFUN ID (X) X)


 1
     当部比
     小宮山 敦史 (KITCC)                M 式で生活してみる                        3/8
M 式 READER


  今の Lisp 処理系は大抵 S 式しか受け付けない……




  小宮山 敦史 (KITCC)   M 式で生活してみる    4/8
M 式 READER


  今の Lisp 処理系は大抵 S 式しか受け付けない……
  M 式で入力できる処理系作るか……?




  小宮山 敦史 (KITCC)   M 式で生活してみる    4/8
M 式 READER


  今の Lisp 処理系は大抵 S 式しか受け付けない……
  M 式で入力できる処理系作るか……?
  と思ったが探したらあった
       http:
       //www.informatimago.com/develop/lisp/com/informatimago/
       small-cl-pgms/m-expression/m-expression.lisp
       CommonLisp で M 式の REPL
       リードした M 式を S 式に変換して処理系に渡すプログラム
  やっぱり誰か作ってるよねー




  小宮山 敦史 (KITCC)          M 式で生活してみる                             4/8
M 式 READER


  今の Lisp 処理系は大抵 S 式しか受け付けない……
  M 式で入力できる処理系作るか……?
  と思ったが探したらあった
       http:
       //www.informatimago.com/develop/lisp/com/informatimago/
       small-cl-pgms/m-expression/m-expression.lisp
       CommonLisp で M 式の REPL
       リードした M 式を S 式に変換して処理系に渡すプログラム
  やっぱり誰か作ってるよねー
  コレさえあれば M 式だけで Lisp ができる……?




  小宮山 敦史 (KITCC)          M 式で生活してみる                             4/8
M 式 WRITER


  人からもらったソースがもし S 式だったら!
                       ?
   (defun parse-m-term (parser)
     (cond
       ((token-p :m-open parser)
        (with-parens (paser :m-open :m-close)
           ‘(cond ,@(parse-m-clauses parser))))
       ((token-p :s-open parser)
         ‘(quote ,(parse-s-expr parser)))
   ...




  小宮山 敦史 (KITCC)                                  M 式で生活してみる   5/8
M 式 WRITER


  人からもらったソースがもし S 式だったら!
                       ?
   (defun parse-m-term (parser)
     (cond
       ((token-p :m-open parser)
        (with-parens (paser :m-open :m-close)
           ‘(cond ,@(parse-m-clauses parser))))
       ((token-p :s-open parser)
         ‘(quote ,(parse-s-expr parser)))
   ...




  S 式->M 式コンバータがあれば M 式になるので読める!
  (defun id (x) x) → id[x] = x




  小宮山 敦史 (KITCC)                                  M 式で生活してみる   5/8
M 式 WRITER


  人からもらったソースがもし S 式だったら!
                       ?
   (defun parse-m-term (parser)
     (cond
       ((token-p :m-open parser)
        (with-parens (paser :m-open :m-close)
           ‘(cond ,@(parse-m-clauses parser))))
       ((token-p :s-open parser)
         ‘(quote ,(parse-s-expr parser)))
   ...




  S 式->M 式コンバータがあれば M 式になるので読める!
  (defun id (x) x) → id[x] = x
  作ってみた



  小宮山 敦史 (KITCC)                                  M 式で生活してみる   5/8
S 式->M 式コンバータ
.
s2m[sexp] = [stringp[sexp]->format[nil;""~A"";sexp];
              atom[sexp]->format[nil;"~(~A~)";sexp];
              eq[DEFUN;car[sexp]]->format[nil;"~(~A[~A]~) = ~A;";
                                          s2m[cadr[sexp]];
                                          s2m-params[caddr[sexp]];
                                          s2m[cadddr[sexp]]];
              eq[SETQ;car[sexp]]->format[nil;"~A := ~A;";
                                         s2m[cadr[sexp]];
                                         s2m[caddr[sexp]]];
              eq[LAMBDA;car[sexp]]->format[nil;"λ [~([~A~)]; ~A]";
                                            s2m-params[cadr[sexp]];
                                            s2m[caddr[sexp]]];
              eq[COND;car[sexp]]->format[nil;"[~{~A~^;~}]";
                                         mapcar[λ [[x];
                                         format[nil;"~A->~A";
                                                     s2m[car[x]];
                                                     s2m-params[cdr[x]]]];
                                         cdr[sexp]]];
              eq[QUOTE;car[sexp]]->format[nil;"~:@(~A~)";
                                          cadr[sexp]];
              t->format[nil;"~(~A~)[~A]";
                            s2m[car[sexp]];
                            s2m-params[cdr[sexp]]]];
s2m-params[params] = format[nil;"~{~A~^;~}";
                                 mapcar[function[s2m];
                                        params]];

      小宮山 敦史 (KITCC)                       M 式で生活してみる                        6/8
S 式->M 式コンバータ
.
(defun s2m (sexp)
  (cond ((stringp sexp) (format nil ""~A"" sexp))
        ((atom sexp) (format nil "~(~A~)" sexp))
        ((eq ’defun (car sexp))
         (format nil "~(~A[~A]~) = ~A;" (s2m (cadr sexp))
                                         (s2m-params (caddr sexp))
                                         (s2m (cadddr sexp))))
        ((eq ’setq (car sexp))
         (format nil "~A := ~A;" (s2m (cadr sexp)) (s2m (caddr sexp))))
        ((eq ’lambda (car sexp))
         (format nil "λ [~([~A~)]; ~A]" (s2m-params (cadr sexp))
                                        (s2m (caddr sexp))))
        ((eq ’cond (car sexp))
         (format nil "[~{~A~^;~}]" (mapcar (lambda (x)
                                             (format nil "~A->~A"
                                                     (s2m (car x))
                                                     (s2m-params (cdr x))))
                                           (cdr sexp))))
        ((eq ’quote (car sexp))
         (format nil "~:@(~A~)" (cadr sexp)))
        (t (format nil "~(~A~)[~A]" (s2m (car sexp))
                                    (s2m-params (cdr sexp))))))
  (defun s2m-params (params)
    (format nil "~{~A~^;~}" (mapcar #’s2m params)))

     小宮山 敦史 (KITCC)                    M 式で生活してみる                             7/8
まとめ




 S 式よりかっこが少ない M 式




 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ




 S 式よりかっこが少ない M 式
 M 式を CommonLisp で読むプログラムの紹介




 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ




 S 式よりかっこが少ない M 式
 M 式を CommonLisp で読むプログラムの紹介
 S 式を M 式に変換するプログラムを作った




 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ




 S 式よりかっこが少ない M 式
 M 式を CommonLisp で読むプログラムの紹介
 S 式を M 式に変換するプログラムを作った
 これで S 式を覚えなくても Lisp が書けるね (笑)




 小宮山 敦史 (KITCC)   M 式で生活してみる     8/8

Mais conteúdo relacionado

Mais procurados

Lispのべんきょう
LispのべんきょうLispのべんきょう
LispのべんきょうHatori Kouiti
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくHiromi Ishii
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
ICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったかICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったかina job
 
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キューYuto Takei
 
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
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
Undecidable Traveler
Undecidable TravelerUndecidable Traveler
Undecidable Travelerkinaba
 
Implementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorImplementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorMasashi Shibata
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 

Mais procurados (11)

Lispのべんきょう
LispのべんきょうLispのべんきょう
Lispのべんきょう
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
ICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったかICFP2009-いかにして我々は戦ったか
ICFP2009-いかにして我々は戦ったか
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Undecidable Traveler
Undecidable TravelerUndecidable Traveler
Undecidable Traveler
 
Implementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorImplementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generator
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 

Semelhante a M-expr

C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
Gaucheでマクロを書こう
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こうHideaki Nagamine
 
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM)
Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM)Atsushi Tadokoro
 
多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーター多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーターKeiichiro Shikano
 

Semelhante a M-expr (10)

20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
Sml#探検隊
Sml#探検隊Sml#探検隊
Sml#探検隊
 
Lazyk
LazykLazyk
Lazyk
 
Gaucheでマクロを書こう
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こう
 
Lispでやる記号微分
Lispでやる記号微分Lispでやる記号微分
Lispでやる記号微分
 
Lisp study
Lisp studyLisp study
Lisp study
 
文字列処理
文字列処理文字列処理
文字列処理
 
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM)
Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)Interactive Music II SuperCollider入門 4 -  楽器を定義、変調合成(RM, AM, FM)
Interactive Music II SuperCollider入門 4 - 楽器を定義、変調合成(RM, AM, FM)
 
多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーター多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーター
 

Último

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 

Último (11)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

M-expr

  • 1. . . M 式で生活してみる 小宮山 敦史 KITCC 小宮山 敦史 (KITCC) M 式で生活してみる 1/8
  • 2. 自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA C で書いた Lisp インタプリタ LOL 参考にして C で書いた forth インタプリタ 小宮山 敦史 (KITCC) M 式で生活してみる 2/8
  • 3. 自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA C で書いた Lisp インタプリタ LOL 参考にして C で書いた forth インタプリタ リリカル Lisp の校正とか Lisp ギャグ Advent Calendar のネタ 1∼2 個 小宮山 敦史 (KITCC) M 式で生活してみる 2/8
  • 4. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  • 5. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  • 6. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい) fact[x] = [x=0 -> 1; T -> x∗fact[x-1]] 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  • 7. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい) fact[x] = [x=0 -> 1; T -> x∗fact[x-1]] Lisp1.5 のマニュアルには M 式で例が載っている M-expressions S-sxpressions car[x] (CAR X) T (QUOTE T) id[x]=x (DEFUN ID (X) X) 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  • 8. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  • 9. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  • 10. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? と思ったが探したらあった http: //www.informatimago.com/develop/lisp/com/informatimago/ small-cl-pgms/m-expression/m-expression.lisp CommonLisp で M 式の REPL リードした M 式を S 式に変換して処理系に渡すプログラム やっぱり誰か作ってるよねー 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  • 11. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? と思ったが探したらあった http: //www.informatimago.com/develop/lisp/com/informatimago/ small-cl-pgms/m-expression/m-expression.lisp CommonLisp で M 式の REPL リードした M 式を S 式に変換して処理系に渡すプログラム やっぱり誰か作ってるよねー コレさえあれば M 式だけで Lisp ができる……? 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  • 12. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  • 13. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... S 式->M 式コンバータがあれば M 式になるので読める! (defun id (x) x) → id[x] = x 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  • 14. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... S 式->M 式コンバータがあれば M 式になるので読める! (defun id (x) x) → id[x] = x 作ってみた 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  • 15. S 式->M 式コンバータ . s2m[sexp] = [stringp[sexp]->format[nil;""~A"";sexp]; atom[sexp]->format[nil;"~(~A~)";sexp]; eq[DEFUN;car[sexp]]->format[nil;"~(~A[~A]~) = ~A;"; s2m[cadr[sexp]]; s2m-params[caddr[sexp]]; s2m[cadddr[sexp]]]; eq[SETQ;car[sexp]]->format[nil;"~A := ~A;"; s2m[cadr[sexp]]; s2m[caddr[sexp]]]; eq[LAMBDA;car[sexp]]->format[nil;"λ [~([~A~)]; ~A]"; s2m-params[cadr[sexp]]; s2m[caddr[sexp]]]; eq[COND;car[sexp]]->format[nil;"[~{~A~^;~}]"; mapcar[λ [[x]; format[nil;"~A->~A"; s2m[car[x]]; s2m-params[cdr[x]]]]; cdr[sexp]]]; eq[QUOTE;car[sexp]]->format[nil;"~:@(~A~)"; cadr[sexp]]; t->format[nil;"~(~A~)[~A]"; s2m[car[sexp]]; s2m-params[cdr[sexp]]]]; s2m-params[params] = format[nil;"~{~A~^;~}"; mapcar[function[s2m]; params]]; 小宮山 敦史 (KITCC) M 式で生活してみる 6/8
  • 16. S 式->M 式コンバータ . (defun s2m (sexp) (cond ((stringp sexp) (format nil ""~A"" sexp)) ((atom sexp) (format nil "~(~A~)" sexp)) ((eq ’defun (car sexp)) (format nil "~(~A[~A]~) = ~A;" (s2m (cadr sexp)) (s2m-params (caddr sexp)) (s2m (cadddr sexp)))) ((eq ’setq (car sexp)) (format nil "~A := ~A;" (s2m (cadr sexp)) (s2m (caddr sexp)))) ((eq ’lambda (car sexp)) (format nil "λ [~([~A~)]; ~A]" (s2m-params (cadr sexp)) (s2m (caddr sexp)))) ((eq ’cond (car sexp)) (format nil "[~{~A~^;~}]" (mapcar (lambda (x) (format nil "~A->~A" (s2m (car x)) (s2m-params (cdr x)))) (cdr sexp)))) ((eq ’quote (car sexp)) (format nil "~:@(~A~)" (cadr sexp))) (t (format nil "~(~A~)[~A]" (s2m (car sexp)) (s2m-params (cdr sexp)))))) (defun s2m-params (params) (format nil "~{~A~^;~}" (mapcar #’s2m params))) 小宮山 敦史 (KITCC) M 式で生活してみる 7/8
  • 17. まとめ S 式よりかっこが少ない M 式 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  • 18. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  • 19. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  • 20. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った これで S 式を覚えなくても Lisp が書けるね (笑) 小宮山 敦史 (KITCC) M 式で生活してみる 8/8