2015-02-08 94 views
0

我試圖通過方案/球拍堆棧跟蹤蟒蛇縮進層次堆棧跟蹤蟒蛇縮進層次

堆棧將與各縮進級別的空格數的一系列數字。一個空格被計爲1,一個符合python規範的標籤是「製表符被替換(從左到右)一到八個空格,使得包括替換的字符總數是八的倍數(這是意圖與Unix所使用的規則相同)。「

我不知道如何/時從棧中彈出一個或多個級別或如何計算的標籤

到目前爲止,我想出了這個

(define stack 0) 

(define push-to-stack! num-spaces (set! stack (cons num-spaces stack))) 

(define pop-one-from-stack! ...) 

(define pop-multiple-from-stack! ...) 

(define num_spaces-for-a-tab ...) 
+0

這種感覺像是非常必要的(因此,非常非Racket-y)嘗試類似的方法。你想要做什麼? – 2015-02-08 05:18:10

+0

我是新來的球拍,這只是一個學習經歷:我想跟蹤一個Python程序中的縮進級別 – user35202 2015-02-08 06:00:06

回答

0

計數縮進WRT標籤:當你遇到一個標籤,它只看作 足以使計到目前爲止高達8

(require (planet jphelps/loop)) 

(define (indentation-level line) 
    (loop for ch across line 
    while (or (eq? ch #\space) 
       (eq? ch #\tab)) 
    count (eq? ch #\space) into spaces 
    when (eq? ch #\tab) do 
     (set! spaces (- (+ spaces 8) 
         (modulo (+ spaces 8) 8))) 
    finally (return spaces))) 

下一個倍數至於保持棧,說不定什麼你想跟蹤的是縮進增加之前的行,並且該行的縮進級別(這將是「if」,「when」,「for」,「def」你正在閱讀的代碼應該是其中的一部分)。

在任何情況下,您的堆棧都是一個列表,所以空堆棧被表示爲'(),而不是0「。因爲Racket的(定義)表單只在模塊內使用時定義了常量,所以必須使用一個框或一個參數可以改變它:

(define stack (box '())) 

推到堆棧(沒有在名稱末尾,因爲它不修改其參數!):

(define (push something) 
    (box-set! stack (cons something stack))) 

啪一個或多個(n是可選參數):

(define (pop (n #f)) 
    (if (not n) 
     (and (not (null? (unbox stack))) 
     (let ((last-push (car (unbox stack)))) 
     (set-box! stack (cdr (unbox stack))) 
     last-push)) 
     (loop repeat n collect (pop))))