add generator example

master
Ondřej Hruška 4 years ago
parent c8d01b6151
commit af52270a29
Signed by untrusted user: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 44
      examples/coroutines2.csn
  2. 27
      examples/itoa.csn

@ -0,0 +1,44 @@
(
; using a coroutine as a generator
(spawn r15 fibo)
(ld r0 20)
(:next)
(ld r1 @r15) ; Read a yielded value
(call printnum r1)
(lds @cout ", ")
(dec r0)
(j.nz :next)
(ld @cout '\n')
(halt)
(proc fibo
(ld r0 0)
(ld r1 1)
(:x)
(yield r1)
(add r2 r0 r1)
(ld r0 r1)
(ld r1 r2)
(j :x)
)
(proc printnum num
(mkbf r15)
(ld r1 num)
(tst r1 (<0? (mul r1 -1)))
(:next)
(mod r0 r1 10)
(add r0 '0')
(bfrpush @r15 r0)
(div r1 10 (z?
(tst num (<0? (bfrpush @r15 '-')))
(lds @cout @r15)
(del @r15)
(ret)))
(j :next)
)
)

@ -1,24 +1,41 @@
( (
; This is an example implementation of itoa using a buffer of characters ; This is an example implementation of itoa using a buffer of characters
(ld r0 -123456789) (ld r0 -123456789)
(mkbf r1) (mkbf r1)
(call itoa r1 r0) (call itoa r1 r0)
; print it ; print it
(:pn) (bfrpop @cout @r1 (em? (ld @cout '\n') (halt))) (j :pn) (:pn) (bfrpop @cout @r1 (em? (ld @cout '\n') (halt))) (j :pn)
(halt) (halt)
(proc itoa buf num (proc itoa buf num
(ld r1 num) (ld r1 num)
(tst r1 (<0? (mul r1 -1))) (tst r1 (<0? (mul r1 -1)))
(:next) (:next)
(mod r0 r1 10) (mod r0 r1 10)
(add r0 '0') (add r0 '0')
(bfrpush @buf r0) (bfrpush @buf r0)
(div r1 10 (z? (div r1 10 (z?
(tst num (<0? (bfrpush @buf '-'))) (tst num (<0? (bfrpush @buf '-')))
(ret))) (ret)))
(j :next) (j :next)
) )
; other version that prints it
(proc printnum num
(mkbf r15)
(ld r1 num)
(tst r1 (<0? (mul r1 -1)))
(:next)
(mod r0 r1 10)
(add r0 '0')
(bfrpush @r15 r0)
(div r1 10 (z?
(tst num (<0? (bfrpush @r15 '-')))
(lds @cout @r15)
(del @r15)
(ret)))
(j :next)
)
) )

Loading…
Cancel
Save