2010-01-15 5 views
1

메모리 슬롯에 무엇인가를 입력하는 메모리 시스템을 만들려고합니다. 그래서 내가하고있는 일은 알리 스트를 만드는 것입니다. 쌍의 자동차는 메모리 위치이고 cdr은 val입니다. 읽기와 쓰기 두 가지 메시지를 이해하는 프로그램이 필요합니다. 선택한 메모리 위치와 해당 위치에 할당 된 val을 표시하고 위치 또는 주소의 값을 변경하여 쓰기 만 읽기. 내 코드가 원하는 위치를 읽고 원하는 위치에 쓸 수 있도록 내 코드를 작성하려면 어떻게해야합니까? 부담없이 직접 시험해보십시오. 어떤 도움이라도 대단히 감사 할 것입니다. 이것은 내가 무엇을 가지고 :구성표 - 메모리 시스템

(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)) 
+0

C 프로그래머로서,이 언어는 상당히 다르지만, 실제로는 두뇌가 뒤틀린 것처럼 보입니다. –

답변

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)]))) 

이있다 (속도) alists을 사용하고 미리 할당 된 범위 이외의 물건에 액세스 할 수 악의적 인 시도에 대한 보호하지의 추가 혜택;). 원하는대로 작품 :

> (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 

이 방금 계획으로 밖으로 시작하는 경우 하드 조금 파악 될 수 있습니다. match-lambda 및 친구들 here에 대해 더 자세히 읽을 수 있습니다. 벡터는 Scheme의 다른 언어 배열과 같습니다 (read this).

관련 문제