2011-10-21 7 views
4

나는 학교를위한 계획 과제를 진행하고 있는데, 레코드 "유형"(목록으로 구현 됨) (음악 레코드를 나타냄)을 정의하는 것과 관련된 질문이 있습니다.스킴 : 레코드 목록에 추가하기

제가 문제가되는 질문은 이러한 레코드의 목록을 만드는 절차를 만든 다음이 목록에 레코드를 추가하는 함수를 만드는 것입니다. 이것은 꽤 간단하지만 뭔가 잘못하고있는 것처럼 느껴집니다.

목록에 요소 (예 :이 예에서는 레코드 선반)를 추가하는 방법을 알고 있지만이 add 함수를 호출 할 때이 목록을 올바르게 유지하는 방법을 모르겠습니다. 여기에 내가 가지고있는 게있어 :

(define (add-record record lst) 
    (append lst (list record))) 

나는 예상대로 작동하지만 문제는이 절차를 호출 할 때입니다.

(define record-self '()) 

내 첫 번째 시도했지만, 물론 때마다 나는 그 단지 정의 record-shelf 목록에 전달하는 add-record 절차 레코드를 추가, 음, 내 추가 기능은 새로운 목록을 반환합니다 (즉, 복사, 첨부 된 기록과 함께). 이것은 의미가 있지만, 내가 원하는 것인지 확실하지 않습니다. 내가 지금처럼 목록에 레코드의 무리를 추가하고 싶었 그래서 경우

: 그것은 내가 원하는 발생하지 않습니다 물론

(add-record highway61 record-shelf) 
(add-record sgtPepper record-shelf) 

, record-shelf가 업데이트되지 않기 때문에. 그리고 나는이 시점에서 우리가 set! 또는 과제를 사용하기로되어 있다고 생각하지 않습니다.

매번 반환 된 목록 (add-record)의 복사본을 가져 와서 다음 호출에서 반환 된 목록을 사용해야합니까?

+0

함수형 프로그래밍에서는 전역 변수를 피해야합니다. 따라서 귀하의 최종 질문에 대한 대답은 '예'입니다. '(add-record sgtPepper (add-record highway61 record-shelf))' – Enrique

+0

그런데 아주 잘 표현 된 질문입니다. – JasonFruit

답변

3

상태를 유지하려는 행동이 필요합니다. 엔리케 (Enrique)가 말했듯이 마지막 질문에 대한 답은 예입니다.

새 머리글을 목록의 머리에 cons 할 수없는 이유가 있습니까? 그것은 Lisp의리스트에 항목을 추가하는 관용적 인 방법이다. 또는 단일 링크 목록을 사용하는 함수 언어로 작성됩니다.

(define (add-record record lst) 
    (cons record lst)) 

(define newshelf (add-record 36chambers oldshelf)) 

는 어떤 형태 set!을 사용하지 않고 add-record를 호출 한 후 record-shelf 새로운 항목을 포함 할 수있는 방법이 없습니다.