2014-04-20 93 views
0

我將如何在計劃中循環此列表?計劃通過列表循環

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

我試過它只顯示第一列。

+0

你是什麼意思「循環這份名單」? –

+0

能夠按順序訪問列表中的每個單詞。 –

回答

1

你有什麼是列表的列表清單:

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

要遍歷所有的元素,你必須創建一個循環的循環的循環。要做到這一點,我們可以使用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))) 

如果您Scheme解釋沒有內置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

如何讓它不打印字樣地打印單詞。它得到的話作爲一個列表,但我不能做任何事情,因爲它有他們周圍的愚蠢的遺忘 (定義(散步列表樂趣) (如果(不(等於?(汽車1st)'())) (fun lst) (if(not(null?(walk-list(car lst)fun) (walk-list(cdr lst)fun)))) (walk-list test-document display) –

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") 

,您可以使用通常的嫌疑人過程(mapfilter,...)。

如果你的計劃沒有flatten過程中,您可以使用此一:

(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