[Gauche-devel-jp] Re: 埋め込み言語の設計

Back to archive index

木谷 洋 ryute****@mac*****
2005年 6月 18日 (土) 12:26:59 JST


On 2005/06/18, at 10:58, Shiro Kawai wrote:
> 仕様を完全に理解できていないんですが、こんなんでどうでしょうか。
>
> (define-syntax @
>   (syntax-rules ()
>     ;; Loop to collect arguments
>     ((@ "collect" (sels ...) (args ...) target ())
>      (objc-send target
>                 (string-append (x->string 'sels) ...)
>                 (list args ...)))
>     ((@ "collect" (sels ...) (args ...) target (sel arg . more))
>      (@ "collect" (sels ... sel) (args ... (@ arg)) target more))
>     ((@ "collect" (sels ...) (args ...) target (msg)) ;; special case?
>      (@ "collect" (sels ... msg) (args ... ()) target ()))
>     ;; Main entry
>     ((@ (op . args))
>      (@ "collect" () () (@ op) args))
>     ((@ obj) ;; base case
>      obj)))
>
> これではダメなケースがある、という場合は、正確な仕様を教えて下 
> さい。
ありがとうございます。これから追ってみます。

念のため正確な仕様を出すと、
0. マクロ@は続くcdr部をObjective-Cのメッセージ 
式と解釈して変換しobjc-sendに渡す。
1. Objective-Cのメッセージ式とは
 1.1 単項メッセージ [receiver sel]
 1.2 キーワードメッセージ [receiver sel: arg ...]
のいずれか。
2. キーワードメッセージのセレクタ部は集積され、単一文字列に変換 
される

3. キーワードメッセージの引数は再帰的にObjective-Cのメッ 
セージ式でありうる
3'.いずれのメッセージ式もreceiverが再帰的にObjective- 
Cのメッセージ式でありうる

4. 引数ないしreceiverが特殊リスト(~ ...)であった場合 
はcdr部を通常のS式と解釈して渡す。つまり
;; items = (1 2 3)
(@ [rec sel: (~ car items)])
->
(@ [rec sel: 1])
のように評価される。(実際は展開後の式にcdr部がそのま 
ま渡る)

付け加えて
(objc-send-as ContextClass obj selector (args ...))
なるクラスのsuper呼び出しを代替する関数があり、

5. マクロ(@-as ctx Message-Form)は@と同様だが 
outermostのメッセージ式のみobjc-send-asに渡すものとして解 
釈する。つまり
(@-as SuperClass [sub-obj sel: [obj msg]])
->
(objc-send-as SuperClass sub-obj "sel:"
     (list (obj-send obj "msg" '())))
のようになる。

という線で考えています。@-asは@があればほぼ同様で 
しょうね。
---
木谷 洋





Gauche-devel-jp メーリングリストの案内
Back to archive index