ハードウェアの最終レポート

結局やってしまった。適当だけど・・・。でも、ウソを書くのは嫌なのでシミュレーションはしっかりやった(あたりまえか)。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))