SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
.

.
                     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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 

Ähnlich wie 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
 

Ähnlich wie 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)
 
多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーター多値で簡単パーサーコンビネーター
多値で簡単パーサーコンビネーター
 

Kürzlich hochgeladen

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Kürzlich hochgeladen (9)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

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