[Back]

5.3 存储分配和废料收集

5.20

x指向p1

y有两个p1在 cars 和一个p2在 cdrs

5.21

    start 
    (assign continue (label done)) 
    (assign n (const 0)) 
    count-loop 
    (test (op null?) (reg lst)) 
    (branch (label null)) 
    (test (op not-pair?) (reg lst)) 
        (branch (label not-pair)) 
        (save continue) 
        (assign continue (label after-car)) 
        (save lst) 
        (assign lst (op car) (reg lst)) 
        (goto (label count-loop)) 
      after-car 
        (restore lst) 
        (assign lst (op cdr) (reg lst)) 
        (assign continue (label after-cdr)) 
        (save val) 
        (goto (label count-loop)) 
      after-cdr 
        (restore n) 
        (restore continue) 
        (assign val 
                (op +) (reg val) (reg n)) 
        (goto (reg continue)) 
    null 
    (assign val (const 0)) 
    (goto (reg continue)) 
    not-pair 
    (assign val (const 1)) 
    (goto (reg continue)) 
    done

5.22

    (assign continue (label append-done)) 
    loop 
    (test (op null?) (reg x)) 
    (branch (label null-x)) 
    (save continue) 
    (assign continue (label cdr-done)) 
    (assign car-x (op car) (reg x)) 
    (save car-x) 
    (assign x (op cdr) (reg x)) 
    (goto (label loop)) 
    null-x 
    (assign x (reg y)) 
    (goto (reg continue)) 
    cdr-done 
    (restore car-x) 
    (assign x (op cons) (reg car-x) (reg x)) 
    (restore continue) 
    (goto (reg continue)) 
    append-done