控え

どうも最近 gdgd 傾向がナニ。いかんなぁ。読み方が微妙なんでしょうか。
と、言いつつ今日も gdgd な深夜なのでメモのみ。

ぢつは

gencomp の compile-toplevel-form 手続きの核心部分で、ちょっと長いですが以下なソレにひっカカり。

      (('define (? symbol? name) ('lambda args . body))
       (let* ((closure
               (compile-toplevel-lambda form name args body (compile-module)))
              (code (cgen-literal (closure-code closure)))
              (var  (cgen-literal name)))
         (cgen-init
          (format "  Scm_Define(mod, SCM_SYMBOL(~a), Scm_MakeClosure(~a, NULL));"
                  (cgen-cexpr var) (cgen-cexpr code))))
       seed)
      (else
       (let1 compiled-code (compile form (compile-module))
         ;; We exclude a compiled code with only CONSTU-RET, which appears
         ;; as the result of macro expansion sometimes.
         (if (toplevel-constu-ret-code? compiled-code)
           seed
           (cons (cgen-literal (compile form (compile-module))) seed))))
      )))

cgen-cexpr か cgen-literal とか。あと closure にナニしてる手続きとか。
あと、上記 else にヒッカカるナニをきちんと確認しておきたいです。

もう少し

getter-with-setter も。

(define (getter-with-setter get set)
  (let ((proc (lambda x (apply get x))))
    (set! (setter proc) set)
    proc))

get に束縛されるのは ref する手続き。

gosh> (ref ref 'methods)
(#<method (ref <string> <integer>)> 
#<method (ref <vector> <integer>)> 
#<method (ref <list> <integer>)> 
#<method (ref <hash-table> <top> <top>)> 
#<method (ref <hash-table> <top>)> 
#<method (ref <top> <symbol>)>) 
gosh>

あるいは setter って何か

gosh> setter
#<subr setter>
gosh> (d setter)
#<subr setter> is an instance of class <procedure>
slots:
  required  : 1
  optional  : #f
  locked    : #t
  info      : "setter"
  setter    : #<subr (setter setter)>
gosh> 

locked という属性 (slot) も理解が微妙。