用于跟踪python缩进级别的堆栈

时间:2015-02-08 05:13:46

标签: scheme racket

我试图通过scheme / racket中的堆栈跟踪python中的缩进级别

堆栈将有一系列数字,每个缩进级别的空格数。空格被计为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 ...)

1 个答案:

答案 0 :(得分:0)

计算缩进WRT标签:当您遇到标签时,它仅计为 足以将计数带到目前为止的下一个倍数。

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