나는 간단한 기능을 찾을 수있는 방법으로 SO 사용 싫지만, 난 정말이 어디서나 같은 기능을 찾을 수 없습니다 : 목록을계획 : 목록에서 요소의 변화 값
감안할를 (1 2 3 4 5), 펄의 (PHP의에 해당하는, 파이썬의) (1 2 3 100 5)
감사 결과
$a = array(1, 2, 3, 4, 5);
$a[3] = 100;
싶습니다!
나는 간단한 기능을 찾을 수있는 방법으로 SO 사용 싫지만, 난 정말이 어디서나 같은 기능을 찾을 수 없습니다 : 목록을계획 : 목록에서 요소의 변화 값
감안할를 (1 2 3 4 5), 펄의 (PHP의에 해당하는, 파이썬의) (1 2 3 100 5)
감사 결과
$a = array(1, 2, 3, 4, 5);
$a[3] = 100;
싶습니다!
당신과 같이, 계략의 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에서 이것을 시도.)
''list-set! '을' guile'. 이렇게하면 스크립트를'닭고기 '로 옮길 수 있습니다. – hpaulj
가이브에는 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)
저는 이것이 언어 표준의 일부임을 확신합니다.
일반적으로 Scheme의'set!'은 장소를 지원하지 않습니다. 그러나 SRFI 17이로드되면 (구현에서 지원하는 경우 --- Guile이) 원하는 경우'(set! (list-ref lst 3) 100)'을 사용할 수 있습니다. 편집 : 죄송합니다, 그것은 가일에서 작동하지 않습니다,하지만'(설정! (caddr) 100)'않습니다. –
나는 nth의 Scheme와 같은 기능을 list-ref라고 생각한다. 불행하게도 적어도 내 환경에서는 참조가 아닌 값을 반환한다. – amindfv
참고 "반환 값"은 Scheme 또는 Lisp에 존재하지 않는 값이다. CL의'setf'가 매크로 수준에서 작동하는 방식은 일부 "반환 된 참조"에서 작동하지 않습니다. Scheme의 srfi-17도 마찬가지입니다. 대신 "반환 된 참조"를 사용하지 않고 setter 함수를 찾기 위해'set!'-ed 함수를 사용합니다. –
어떤 SRFI없이 표준 기능을 사용하여 :
(set-car! (list-tail lst k) val)
나는 될 수 있습니다 조금 늦었지만 다른 대답이 있습니다.
기능 프로그램 패러다임의 일부는 가능한 경우 데이터를 수정하지 않는 것입니다. 효율성을 위해 다른 답변을 원할 수 있습니다. 그러나 그렇지 않은 경우, 이와 같은 비 돌연변이 기능을 고려
다음 테스트를 통과(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"라이브러리 테스트 하지만 꽤 휴대용 체계처럼 보인다.)
이것이 데이터 구조, 셀의 무작위 재 할당을 원하는 기능의 종류라면, 아마 목록을 원하지 않는다고 생각 했습니까? 하지만 대신 벡터일까요? –