1

私はあなたがメモリのスロットに何かを入力するメモリシステムを作ろうとしています。つまり、私が行っているのはAlistを作成することであり、ペアの車はメモリの場所であり、cdrはvalです。読み取りと書き込みの2つのメッセージを理解するためのプログラムが必要です。選択したメモリ位置とその位置に割り当てられた値を表示するだけで読み取りと書き込みにより、位置またはアドレスの値が変更されます。コードを作成して、目的の場所を読み取り、目的の場所に書き込むにはどうすればよいですか?これを自分でテストしてください。どんな助けでも大歓迎です。これは私が持っているものです:

(define make-memory
  (lambda (n)
    (letrec ((mem '())
             (dump (display mem)))
      (lambda ()
        (if (= n 0)
            (cons (cons n 0) mem) mem)
            (cons (cons (- n 1) 0) mem))
      (lambda (msg loc val)
        (cond
          ((equal? msg 'read) (display 
                               (cons n val))(set! n (- n 1)))
          ((equal? msg 'write) (set! mem 
                                     (cons val loc)) (set! n (- n 1)) (display mem)))))))


(define mymem (make-memory 100))
4

1 に答える 1

2

考えられる解決策:

(define (make-memory n)
  (let ([memory  (make-vector n 0)]
        [protect (lambda (addr) 
                   (if (and (addr . >= . 0) (addr . < . n)) 
                     addr 
                     (error "access to outside of memory")))])
    (match-lambda*
     [`(read  ,addr)    (cons addr (vector-ref memory (protect addr)))]
     [`(write ,addr ,x) (vector-set! memory (protect addr) x)])))

これには、(速度のために) 連想リストを使用しないという追加の利点があり、事前に割り当てられた範囲外のものにアクセスしようとする悪意のある試みから保護します;)。必要に応じて動作します:

> (define mem (make-memory 10))
> (mem 'read 0)
(0 . 0)
> (mem 'read 2)
(2 . 0)
> (mem 'write 2 10)
> (mem 'read 2)
(2 . 10)
> (mem 'read 100)
access to outside of memory

これは、Scheme を使い始めたばかりの場合、理解するのが少し難しいかもしれません。match-lambdaとフレンズの詳細については、こちらをご覧ください。ベクトルは、Scheme で他の言語の配列に相当します (こちらをお読みください)。

于 2010-02-04T13:17:46.873 に答える