今日も職場に居たりする。
基本的に待機なソレ、とゆー事で先日エントリした NortonGhost2003 によるバックアップなナニやらその他モロモロをメモ。
NortonGhost2003
何がしたいか、とゆーとデスクトップマシンのインストールが完了した時点でのディスクのイメージをバックアップしといて、元に戻せるように、という目的。台数もそこそこあるのでインストールな手間を省きたい、という事もある模様。
ちょい前に Thinkdpad R60e だったかでヤッた時には普通にバックアップできたのに、機械が古いからなのかどうかは不明ですが、PC-DOS なバックアッププロセスの開始時点で USB な SONY DRX-510UL を認識しない。
この問題が発現してから、忙しかった事もあって当分塩漬けにしてスルーしてたんですが、今週若干稼動に余裕が出たので作業再開。色々調べてみるに起動フロッピー作っていくつかドライバを組み込んでやる必要がある、との事らしい。
現時点で正常動作を確認できてない状況なんですが、外付け DVD なドライブは認識できている状態なんで、以下に修正した autoexec.bat と config.sys を。
autoexec.bat
mscdex /d:mscd000
config.sys
device=usbaspi.sys device=usbcd.sys /d:mscd000
ちなみに現在バックアッププロセスが 50% 完了している模様。昨日は 20% くらいでカタマってたり異常終了してたりしてました。原因は不明ですが、パーティション構成が微妙だったので WinXP の再インストールを実施し、今日リトライ中。
で、60% あたりで異常終了。DOS が DVD ドライブを見失っているようにも見える。ghost 終了後、リトライしても DVD なドライブが見えん。
現在、himem.sys 使うナニでリトライ中。こっちだとレジスタダンプ吐いて止まってたんだよねぇ (止まった)。以前の担当者はバックアップなメディアを作ってたらしいんですが、どんなワザを使っていたのだろうか。
その後
ドライバですが、aspiehci.sys を使った方が良さげ、との情報もあり。もういやだ。
SICP
問題 4.30 は終了。4.31 も大変そうだなぁ。とりあえず define の流れを整理。
- eval 内で definition 認定された式を eval-definition に渡す
- eval-definition では変数とその値 (手続きの場合は手続き名と lambda 式) を eval した式 (手続きの場合は procedure で始まるリスト) を define-variable! に渡す
- define-variable ではフレーム内で変数を探して適当な位置に束縛を設定
ちなみにこの手続きは apply においては compound-procedure 認定で 4.2 なソレであれば以下の式で評価される。
(eval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) ; arguments (list-of-delayed-args arguments env) (procedure-environment procedure))))
ここで全部の引数が delay されてしまう、と。どうしたものやら。
検討
ぶっちゃけ apply でヤッツケてやろうと思えば何とかなるな。eval で手続きの define なリストが手続き名と procedure なリストのソレになってフレームに、な部分はスルーで OK な感じがします。
面倒なので手続き名は同じにしてしまえ。こんな感じになるか。
(define (list-of-delayed-args exps env) (define (delay-or-eval exp env) (if (pair? exp) (delay-it exp env) (actual-value exp env))) (if (no-operands? exps) '() (cons (delay-or-eval (first-operand exps) env) (list-of-delayed-args (rest-operands exps) env))))
ただし、上の場合は memoize なナニの考慮が一切ナシ。むしろこっちの切り分けの方がメンドいなぁ。ってよく考えてみるに parameter をどう扱うか、も問題。
(define (f a (b lazy) c (d lazy-memo)) ...)
がテキストで例示されているソレなんですが、変数 f に束縛されるのは
(procedure (a (b lazy) c (d lazy-memo)) (...) env)
みたいな感じになるはず。上記なソレであれば procedure-parameters を取り出して、(a b c d) なリストにしてしまう手続きも必要か。だったら以下のようなソレで何とかなるのかなぁ。
(define (apply procedure arguments env) (cond ((primitive-procedure? procedure) (apply-primitive-procedure procedure (list-of-arg-values arguments env))) ((compound-procedure? procedure) (eval-sequence (procedure-body procedure) (extend-environment (make-parameters (procedure-parameters procedure)) (list-of-delayed-args arguments env) (procedure-environment procedure)))) (else (error "Unknown procedure type -- APPLY" procedure)))) (define (make-parameters l) (if (null? l) '() (cons (if (pair? (car l)) (caar l) (car l)) (make-parameters (cdr l))))) (define (list-of-delayed-args exps env) (define (delay-or-eval exp env) (if (pair? exp) (if (eq? (cadr exp) 'lazy) (lazy-it exp env) (lazy-memo-it exp env)) (actual-value exp env))) (if (no-operands? exps) '() (cons (delay-or-eval (first-operand exps) env) (list-of-delayed-args (rest-operands exps) env)))) (define (lazy-it exp env) (list 'lazy exp env)) (define (lazy-memo-it exp env) (list 'lazy-memo exp env)) (define (lazy? obj) (if (pair? obj) (eq? 'lazy (cadr obj)) #f)) (define (lazy-memo? obj) (if (pair? obj) (eq? 'lazy-memo (cadr obj)) #f)) (define (force-it obj) (cond ((lazy? obj) (actual-value (thunk-exp obj) (thunk-env obj)) obj) ((lazy-memo? obj) (let ((result (actual-value (thunk-exp obj) (thunk-env obj)))) (set-car! obj 'evaluated-thunk) (set-car! (cdr obj) result) ; replace exp with its value (set-cdr! (cdr obj) '()) ; forget unneeded env result)) ((evaluated-thunk? obj) (thunk-value obj)) (else obj)))
すんげぇざっくりな検討だなぁ。thunk を無理矢理二つに分けてヨシとしているあたり、ざっくり系の面目躍如という感じがする。