2014-04-20 3 views
0

체계에서이 목록을 어떻게 반복 할 수 있습니까?목록을 통한 체계 순환

(define test-document '(
        ((h e l l o)) 
        ((t h i s)(i s)(t e s t)) 
        )) 

첫 번째 열만 보여주었습니다. 당신은 루프의 루프의 루프를 만들어야합니다

(define test-document '(((h e l l o)) ((t h i s) (i s) (t e s t)))) 

요소를 반복 할

+0

는 "루프 목록"에 의해 무엇을 의미합니까 : 당신의 계획이 더 flatten 절차가없는 경우

, 당신이 하나를 사용할 수 있습니다? –

+0

목록의 각 단어를 순서대로 액세스 할 수 있습니다. –

답변

1

당신이 가진 것은리스트의리스트의 목록입니다. 다음과 같이 할 수있는 그래서 우리는 mapcurry를 사용할 수 있습니다

(map (curry map (curry map 
     (compose string->symbol string-upcase symbol->string))) 
    test-document) 

이 다음과 같은 출력이 생성 당신의 계획 인터프리터가없는 경우

(((H E L L O)) ((T H I S) (I S) (T E S T))) 

내장 curry 기능하는 것은 다음 사용자가 정의 할 수 있습니다 하나는 다음과 같습니다 :

(define (curry func . args) 
    (lambda x (apply func (append args x)))) 

희망이 도움이되었습니다.

+0

카레가 정의되지 않았다고 말합니다 –

+0

어떤 스킴을 사용하고 있습니까? 'curry' 함수는'mzscheme'에서 사용 가능합니다. 어쨌든 나는'카레 '구현으로 나의 대답을 업데이트했다. –

3

carcdr 기능 군은 목록을 탐색하는 친구입니다. 여기 몇 가지 예가 있어요.

(define test-document '(
        ((h e l l o)) 
        ((t h i s)(i s)(t e s t)) 
        )) 

(car test-document) ;; `((h e l l o)) 
(caar test-document) ;; `(h e l l o) 
(cadr test-document) ;; `((t h i s) (i s) (t e s t)) 
(car (cadr test-document) ;; `(t h i s) 
(cadr (cadr test-document) ;; `(i s) 
(caddr (cadr test-document) ;; `(test) 

목록을 걷고 목록이 아닌 각 항목에 대해 함수를 호출하는 함수를 정의하십시오.

(define (walk-list lst fun) 
    (if (not (list? lst)) 
     (fun lst) 
     (if (not (null? lst)) 
     (begin 
      (walk-list (car lst) fun) 
      (walk-list (cdr lst) fun))))) 

각 항목을 인쇄하려면이 버튼을 누릅니다.

(walk-list test-document print) 
+0

그러나 문서의 크기를 모르는 경우에는 어떻게해야합니까? –

+1

@PhilipRego 필자는 목록을 걷고 그 안에있는 항목으로 무엇을 할 수 있는지 설명하기 위해 내 대답에 더 많은 내용을 추가했습니다. –

+0

perehesis없이 단어를 인쇄하려면 어떻게해야합니까? 그것은 목록으로 단어를 가져 오지만 주위에 멍청한 pareteses을 가지고 있기 때문에 그것으로 아무것도 할 수 없어 (정의 (도보 목록 lst 재미) (if (같지 않아? (자동차 lst) '())) (재밌다) (if (not (null?(walk-list test-document display) (walk-list test-document display) (walk-list (car lst) fun) (walk-list 테스트 문서 표시) –

1

이런 식으로 생각 하시나요?

(define (walk-list lst) 
    (define (sub-walk lst) 
    (if (null? lst) 
     '() 
     (let ((x (car lst))) 
      (if (list? x) 
       (cons (sub-walk x) (sub-walk (cdr lst))) 
       (apply string-append (map symbol->string lst)))))) 
    (flatten (sub-walk lst))) 

다음
(walk-list test-document) 
=> '("hello" "this" "is" "test") 

당신은 평소 용의자를 사용하여 처리 할 수있는 ( map, filter, ...).

(define (flatten lst) 
    (reverse 
    (let loop ((lst lst) (res null)) 
    (if (null? lst) 
     res 
     (let ((c (car lst))) 
      (loop (cdr lst) (if (pair? c) (loop c res) (cons c res)))))))) 
+0

기능이 없습니다. 평평한 –

+1

그래서 나는 내 답변에 하나 넣어! – uselpa

관련 문제