ハードウェアの最終レポート
結局やってしまった。適当だけど・・・。でも、ウソを書くのは嫌なのでシミュレーションはしっかりやった(あたりまえか)。1年生のときに書いたクイックソートプログラムを動かそうと思ったけど、うまく動かない。アセンブラで書かれているから読む気もしない。たぶん、読んで理解するよりも新しいのを書いたほうが早い。結局、テストプログラムは乗算にした。アセンブラでやるときはコメントを忘れずに。正確には、クイックソートプログラムにはコメントはあった。でも、MIPSアセンブラの別な形式が書かれていただけだった。
add $14, $11, $5 ; 33: add $t6, $t3, $a1
こんな感じに。このコメント部がレポートにはジャマなので取り除くことにした。たいした量じゃないのでエディタでやっても良かったのだが、Schemeでスクリプトを作ってみた。
で、できたのが下のスクリプト(評価器はgauche)。last-charとか言いながら文字列を返したり、長さ0の文字列への対処が一貫してなかったり(del-commentは呼び出し側、del-waste-spaceは呼び出された側)と気に食わないが、一応動く。せっかく講義でSchemeやったのだから使っていかないとね。
#!/usr/bin/env gosh (define (main args) (if (null? (cdr args)) '() (format (cadr args)))) (define (del-comment str) (let ((substr (string-scan str ";" 'before))) (if (string? substr) substr str))) (define (string-index string index) (substring string index (+ index 1))) (define (del-waste-space str) (if (= (string-length str) 0) str (let* ((last-char-point (- (string-length str) 1)) (last-char (string-index str last-char-point))) (cond ((= last-char-point 0) str) ((or (string=? " " last-char) (string=? "\t" last-char)) (del-waste-space (substring str 0 last-char-point))) (else str))))) (define (format filename) (define input-file (open-input-file filename)) (define (format-iter) (let ((str (read-line input-file))) (cond ((eof-object? str) '()) ((> (string-length str) 0) (display (del-waste-space (del-comment str))) (newline) (format-iter)) (else (format-iter))))) (format-iter))