2014-04-30 7 views
1

목록 번호의 값을 변경하고 싶지만 항상 집합을 표시합니다! : 식별자가 아닙니다 : (car (cdr (car a))) 무엇을해야할지 모르겠으나, 나를 도울 수있는 사람? 감사합니다. 이 방법으로 업데이트를 수행 할 경우스키마의 목록 값을 변경하는 방법

(define a (list (list burnie 236.67) (list launceston 163.66))) 
(define-syntax-rule (myset-car! lst val) 
    (if (not (list? lst)) 
     lst 
     (set! lst (cons val (cdr lst))))) 

(define update_gn 
    (lambda (a) 
    (cond 
     ((null? a) #t) 
     (else 
     (myset-car! (car (cdr (car a))) (+ (car (cdr (car a))) (car new_gn))) 
     (update_gn (cdr a)))))) 

답변

0

, 당신은 정말 벡터이 아닌 목록을 사용합니다.

목록을 사용하면 상위 함수를 사용하여 목록을 반복하고 새 목록을 반환하는보다 기능적인 접근 방식을 사용해야합니다. 예를 들어, 각 하위 목록의 모든 두 번째 요소에 열을 추가! 그들이 계획에서 벗어난 후에는 불변 만든 이후 당신은 #에서 라켓 (언어를) 쌍을 변이 할 수

> (define a (list (list 'burnie 236.67) (list 'launceston 163.66))) 
> a 
'((burnie 236.67) (launceston 163.66)) 

> (map (lambda (lst) (list (car lst) (+ (cadr lst) 10))) a) 
'((burnie 246.67) (launceston 173.66)) 
> a ; has not been modified 
'((burnie 236.67) (launceston 163.66)) 

> (set! a (map (lambda (lst) (list (car lst) (+ (cadr lst) 10))) a)) 
> a ; has been modified 
'((burnie 246.67) (launceston 173.66)) 
2

. ! 당신이 실제로 # 라켓 (언어)에서 변경할 쌍을해야합니까, 지금

#!r6rs 
(import (rnrs) (rnrs mutable-pairs)) 

(define test-list (list (list 'burnie 236.67) (list 'launceston 163.66))) 
(define new-gn (list 10)) ; I'm not sure what this actually is, but tyhe procedures expect it to be a pair with a numeric car. 

(define (update-gn lst) 
    (cond 
    ((null? lst) #t) 
    (else 
    (set-car! (cdar lst) (+ (cadar lst) (car new-gn))) 
    (update-gn (cdr lst))))) 

(update-gn test-list) 
test-list ; ==> ((burnie 246.67) (launceston 173.66)) 

,하지만 당신은 필요 : 당신이 라켓 (응용 프로그램)에서 Scheme 언어를 사용하는 경우이 작업을 수행 할 수있을 것입니다 mcons, mcarmcdr을 사용하고 mpair?이 아니라 pair?이 아닙니다. 이 (define mcadar (compose mcar mcdr mcar))과 같은 cadar을 소유해야하며 사용하는 고급 함수의 대부분은 지원하지 않으므로 직접 작성해야합니다. 이렇게하면 매우 고통스럽고 설계 상 그렇게됩니다. 나는 보통 R6RS (Standard Scheme)로 언어를 바꾼다. 두 번째로 나는 가변 쌍을 필요로한다.

관련 문제