История изменений
Исправление
MOPKOBKA,
(текущая версия)
:
(define (materialize lst)
(cond
[(not (procedure? lst)) lst]
[(null? (lst 'cdr))
(my-cons (lst 'car) null)]
[(my-cons (materialize (lst 'car)) (materialize (lst 'cdr)))]))
(define (to-json lst)
(cond
[(null? lst) (printf "null")]
[(procedure? lst)
(printf "[")
(to-json (lst 'car))
(printf ", ")
(to-json (lst 'cdr))
(printf "]")]
[else
(printf "~a" lst)]))
(define lst (my-iota 3))
(define lst2 (materialize lst)) ;; сериализация в cons
(printf "materialize end~%") ;; сериализация в json
(to-json lst2)
Вывод:
iota call
iota call
iota call
iota call
iota call
iota call
materialize end
[1, [2, [3, null]]]
А бесконечные списки и на обычных делаются простым использованием my-cdr в вместо cdr.
Да и в ассемблере тоже, осталось пропатчить остальные функции.
Исправление
MOPKOBKA,
:
(define (materialize lst)
(cond
[(not (procedure? lst)) lst]
[(null? (lst 'cdr))
(my-cons (lst 'car) null)]
[(my-cons (materialize (lst 'car)) (materialize (lst 'cdr)))]))
(define (to-json lst)
(cond
[(null? lst) (printf "null")]
[(procedure? lst)
(printf "[")
(to-json (lst 'car))
(printf ", ")
(to-json (lst 'cdr))
(printf "]")]
[else
(printf "~a" lst)]))
(define lst (my-iota 3))
(define lst2 (materialize lst))
(printf "materialize end~%")
(to-json lst2)
Вывод:
iota call
iota call
iota call
iota call
iota call
iota call
materialize end
[1, [2, [3, null]]]
А бесконечные списки и на обычных делаются простым использованием my-cdr в вместо cdr.
Да и в ассемблере тоже, осталось пропатчить остальные функции.
Исправление
MOPKOBKA,
:
(define (materialize lst)
(cond
[(not (procedure? lst)) lst]
[(null? (lst 'cdr))
(my-cons (lst 'car) null)]
[(my-cons (materialize (lst 'car)) (materialize (lst 'cdr)))]))
(define (to-json lst)
(cond
[(null? lst) (printf "null")]
[(procedure? lst)
(printf "[")
(to-json (lst 'car))
(printf ", ")
(to-json (lst 'cdr))
(printf "]")]
[else
(printf "~a" lst)]))
(define lst (my-iota 3))
(define lst2 (materialize lst))
(printf "materialize end~%")
(to-json lst2)
Вывод:
iota call
iota call
iota call
iota call
iota call
iota call
materialize end
[1, [2, [3, null]]]
А бесконечные списки и на обычных делаются простым использованием my-cdr в вместо cdr.
Да и в ассемблере тоже, осталось пропатчить остальные функции.
Исходная версия
MOPKOBKA,
:
(define (materialize lst)
(cond
[(not (procedure? lst)) lst]
[(null? (lst 'cdr))
(my-cons (lst 'car) null)]
[(my-cons (materialize (lst 'car)) (materialize (lst 'cdr)))]))
(define (to-json lst)
(cond
[(null? lst) (printf "null")]
[(procedure? lst)
(printf "[")
(to-json (lst 'car))
(printf ", ")
(to-json (lst 'cdr))
(printf "]")]
[else
(printf "~a" lst)]))
(define lst (my-iota 3))
(define lst2 (materialize lst))
(printf "materialize end~%")
(to-json lst2)
Вывод:
iota call
iota call
iota call
iota call
iota call
iota call
materialize end
[1, [2, [3, null]]]