Skip to content

Instantly share code, notes, and snippets.

@chiro
Last active August 29, 2015 14:04
Show Gist options
  • Save chiro/ac49b19f66bdb1acde44 to your computer and use it in GitHub Desktop.
Save chiro/ac49b19f66bdb1acde44 to your computer and use it in GitHub Desktop.
;; LDC 0, LDC 0, CEQ, TSEL adr 0 でadrへの無条件jmpを表現できることを使って
;; 0+..+n をループで求める
;; environment frame の破壊的変更は ST でできる
LDC 0 ; sum
LDC 10 ; n
CONS
LDF 7
AP 1
DBUG
RTN
LD 0 0
CDR
LDC 0
CEQ
TSEL 12 15
LD 0 0
CAR
RTN
LD 0 0 ; n != 0
CAR
LD 0 0
CDR
ADD
LD 0 0
CDR
LDC 1
SUB
CONS
ST 0 0
LDC 0
LDC 0
CEQ
TSEL 7 0 ;; always jump to 7
LDC 10 ; n
LDF 5
AP 1
DBUG
RTN
LD 0 0
LDC 0
CEQ
SEL 10 12
RTN
LDC 0
JOIN
LD 0 0
LD 0 0 ; x > 1
LDC 1
SUB
LDF 5
AP 1
ADD
JOIN
;; SELのかわりにTSELを使うとJOINがいらなくなる
LDC 10 ; n
LDF 5
AP 1
DBUG
RTN
LD 0 0
LDC 0
CEQ
TSEL 9 11
LDC 0
RTN
LD 0 0 ; x > 1
LD 0 0
LDC 1
SUB
LDF 5
AP 1
ADD
RTN
;; (n, acc) を引数にとって、末尾再帰するver.
;; スタックを食いつぶさない
LDC 3 ; n
LDC 0 ; acc
CONS
LDF 7
AP 1
DBUG
RTN
LD 0 0
CAR
LDC 0
CEQ
TSEL 12 15
LD 0 0 ; n == 0
CDR
RTN
LD 0 0
CAR
LDC 1
SUB
LD 0 0
CDR
LD 0 0
CAR
ADD
CONS
LDF 7
TAP 1
RTN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment