中的程序的循環工作機制。DrRacket用戶的程序
我很努力地理解這個程序是如何工作的。我自己寫了它,它做了它必須做的事但我不明白怎麼做。
我定義而循環爲:
(define (while test body)
(if (test)
(begin
(body)
(while test body))
(void)))
現在我需要編寫一個給定的程序適用於一個可變列表中的每個元素的程序。
這裏是我寫的:
(define (mlist-map-while f x)
(while (lambda() (not (null? x)))
(lambda()
(set-mcar! x (f (mcar x)))
(set! x (mcdr x))))
(void))
所以,定義
list1 (mlist 1 2 3)
和應用
(mlist-map-while (lambda (x) (+ x 1)) list1)
我們得到'(2 3 4)
。
,我不明白的事情是列表的第一個元素是如何保持它,因爲如果它這樣做我怎麼寫到這裏
(set! x (mcdr x))
,設置-mcar!
必須是無用的,是第一道工序與第二個重疊。就像這個例子:
(define list1 (mlist 1 2 3))
(set-mcar! list1 9)
(set-mcdr! list1 (mcdr list!))
,我們缺乏的第一要素,但這個方案在某種程度上離開它,並給出所需的輸出。我想知道它是如何工作的以及是否有另一種遍歷給定列表的方式。
那麼這是否意味着如果我在你的例子中定義了list1-ref((set!list1-ref(mcdr list)))值2和3仍然指向list1的第二個和第三個值?如果我改變它們,list1的值將分別改變? – Dmitrii
是的。由於列表是如何建模的,每個元素對都有一個元素和一個鏈接到列表的其餘部分。 '(mlist 1 2 3)'與'(mcons 1(mcons 2(mcons 3'()))' – Sylwester
'相同'Scheme雖然具有TCO保證......只是說'。 –