Reading Gauche/vm/insn/RECEIVE


Top / Reading Gauche / vm / insn / RECEIVE

RECEIVE

RECEIVE reqargs restarg

説明

SRFI 8: RECEIVE: Binding to multiple values で説明されている (receive ...) の機能を提供する。
オペランドはそれぞれ

reqargs受け取る多値の必須個数
restargオプショナルな多値を受け取る場合は 1 。そうでなければ 0

である。

以下のように多値を receive する。

  1. VMが保持する多値の個数 vm->numVals と reqargs を比べて過不足があればエラーにする
  2. オペコードが TAIL_RECEIVE か RECEIVE かにより継続を調整する
    1. TAIL_RECEIVE の場合。末尾文脈にあるので継続フレームを PUSH しない
    2. RECEIVE の場合、継続フレームを PUSH する
  3. reqargs 分の多値を VAL0 と多値レジスタから参照しスタックに PUSH する
  4. restarg が 1 であれば、残りの多値を1つのリストとしてまとめ PUSH する
  5. 環境フレームを PUSH する
  6. 後続のコードではスタックに積まれた値(receive した値)を通常の let から参照しているかのごとく参照する

使用例

関連インストラクションのTAIL-RECEIVEの例です。

gosh> (disasm (lambda () (receive (a) 1 a)))

;; 0 CONSTI(1)

;; 1 TAIL-RECEIVE(1,0) ; (receive (a) 1 a)

;; 2 LREF0 ; a

;; 3 RET

メモ

SRFIでは以下のように call-with-values (R5RS) を使い receive をマクロとして実装する例が紹介されている。

(define-syntax receive
  (syntax-rules ()
    ((receive formals expression body ...)
     (call-with-values (lambda () expression)
                       (lambda formals body ...)))))

しかしながら Gauche では逆に receive を利用して call-with-values が実装されているのが面白い。

(define-in-module scheme (call-with-values producer consumer)
  (receive vals (producer) (apply consumer vals)))

関連項目

関連インストラクション

コメント

コメントはありません。 コメント/Reading Gauche/vm/insn/RECEIVE?

お名前:

MENU

now: 2

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2909, today: 1, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-07-23 (水) 10:17:04 (3739d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.071 sec.