我试图通过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 ...)
答案 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))))