ReadingGauche

APPEND なソレをどうまとめるか。そういえば append ってこんなのもナニ

gosh> (append '(1 2))
(1 2)
gosh>

disasm したらこんなカンジ。

gosh> (disasm (lambda () (append '(1 2))))
main_code (name=#f, code=0x81f1ca0, size=4, const=1, stack=0):
args: #f
     0 CONST (1 2)
     2 APPEND(1)                ; (append '(1 2))
     3 RET 
#<undef>
gosh> 

ポイントとしては

  • 末端の引数は val0 にセットされる
  • 他の引数は (あれば) ケツから順に Scm_Append2 で末端側からナニ
  • 引数ない場合、'() が val0 にセットされて終了

うーん

まとめがムズい。使用例は追加が必要かなぁ。下書きを以下に (順不同

  • 引数が無い場合、空リストが val0 にセットされて終了
  • 引数が一つだけの場合、その引数オブジェクトが戻される

こいつ達は使用例でナニした方が良さげ??

gosh> (append)
()
gosh> (disasm (lambda () (append)))
main_code (name=#f, code=0x814a5a8, size=2, const=0, stack=0):
args: #f
     0 APPEND(0)                ; (append)
     1 RET
#<undef>
gosh> (append 1)
1
gosh> (disasm (lambda () (append 1)))
main_code (name=#f, code=0x81f1c10, size=3, const=0, stack=0):
args: #f
     0 CONSTI(1) 
     1 APPEND(1)                ; (append 1)
     2 RET 
#<undef>
gosh> 

困った。でも Scm_Append2 なソレによればリストは新たに割り当てられるという事なのか。でも最後の引数はコピーにはならん、というのもナニ。あと最後の引数は set-cdr! されるというのも。
って set-cdr! されるのは最後の引数だけではないのか。

まとめ下書き

引数で与えられたリストを append したリストを val0 レジスタにセットする命令。
引数が一つだった場合には引数が val0 レジスタに、引数が無かった場合には空リストが val0 にセットされる。
又、val0 にセットされるリストは最後の引数以外は引数のコピーが使用される。

うーん、日本語的に微妙ですが、とりあえず投入してコメントを期待 (を