2011-09-11 2 views
7

나는 간단한 기능을 찾을 수있는 방법으로 SO 사용 싫지만, 난 정말이 어디서나 같은 기능을 찾을 수 없습니다 : 목록을계획 : 목록에서 요소의 변화 값

감안할를 (1 2 3 4 5), 펄의 (PHP의에 해당하는, 파이썬의) (1 2 3 100 5)

감사 결과

$a = array(1, 2, 3, 4, 5); 
$a[3] = 100; 

싶습니다!

+4

이것이 데이터 구조, 셀의 무작위 재 할당을 원하는 기능의 종류라면, 아마 목록을 원하지 않는다고 생각 했습니까? 하지만 대신 벡터일까요? –

답변

7

당신과 같이, 계략의 list-set!을 작성할 수 있습니다

(define a (list 1 2 3 4))  ; a is '(1 2 3 4) 

(define (list-set! list k val) 
    (if (zero? k) 
     (set-car! list val) 
     (list-set! (cdr list) (- k 1) val))) 

(list-set! a 2 100)   ; a is '(1 2 100 4) 

이 (DrRacket에서 이것을 시도.)

+0

''list-set! '을' guile'. 이렇게하면 스크립트를'닭고기 '로 옮길 수 있습니다. – hpaulj

3

가이브에는 0에서 시작하는 인덱스를 사용하여 정확히 원하는대로 수행하는 list-set!이라는 기본 제공 함수가 있습니다.

(define a '(1 2 3 4 5)) 
(list-set! a 3 100) 

내가이 그러나, 표준 제도라고 생각하지 않습니다, 그것은 정말 효율적 모르겠어요 : 귀하의 예를 들어, 당신은 할 것이다. 고정 길이 배열의 경우 벡터를 사용해야합니다.

(define a2 #(1 2 3 4 5)) 
(vector-set! a2 3 100) 

저는 이것이 언어 표준의 일부임을 확신합니다.

+1

일반적으로 Scheme의'set!'은 장소를 지원하지 않습니다. 그러나 SRFI 17이로드되면 (구현에서 지원하는 경우 --- Guile이) 원하는 경우'(set! (list-ref lst 3) 100)'을 사용할 수 있습니다. 편집 : 죄송합니다, 그것은 가일에서 작동하지 않습니다,하지만'(설정! (caddr) 100)'않습니다. –

+0

나는 nth의 Scheme와 같은 기능을 list-ref라고 생각한다. 불행하게도 적어도 내 환경에서는 참조가 아닌 값을 반환한다. – amindfv

+0

참고 "반환 값"은 Scheme 또는 Lisp에 존재하지 않는 값이다. CL의'setf'가 매크로 수준에서 작동하는 방식은 일부 "반환 된 참조"에서 작동하지 않습니다. Scheme의 srfi-17도 마찬가지입니다. 대신 "반환 된 참조"를 사용하지 않고 setter 함수를 찾기 위해'set!'-ed 함수를 사용합니다. –

3

어떤 SRFI없이 표준 기능을 사용하여 :

(set-car! (list-tail lst k) val) 
3

나는 될 수 있습니다 조금 늦었지만 다른 대답이 있습니다.

기능 프로그램 패러다임의 일부는 가능한 경우 데이터를 수정하지 않는 것입니다. 효율성을 위해 다른 답변을 원할 수 있습니다. 그러나 그렇지 않은 경우, 이와 같은 비 돌연변이 기능을 고려

다음 테스트를 통과
(define (list-with lst idx val) 
    (if (null? lst) 
    lst 
    (cons 
     (if (zero? idx) 
     val 
     (car lst)) 
     (list-with (cdr lst) (- idx 1) val)))) 

:

(describe "a function that returns a list with a 'changed' value" 
    (it "can modify the edges of lists without having 1-off errors" 
    (expect (list-with '(1 2 3 4 5) 0 99) (be equal? '(99 2 3 4 5))) 
    (expect (list-with '(1 2 3 4 5) 4 99) (be equal? '(1 2 3 4 99)))) 
    (it "has something to do with creating new lists" 
    (expect (list-with '(1 2 3 4 5) 2 99) (be equal? '(1 2 99 4 5)))) 
    (it "doesnt just modify the contents of the original list" 
    (let ((a '(1 2 3 4 5))) 
     (list-with a 2 99) 
     (expect a (be equal? '(1 2 3 4 5)))))) 

(코드는 치킨 계획 작성되고 "missbehave"라이브러리 테스트 하지만 꽤 휴대용 체계처럼 보인다.)