Execute HQ9+/Ursala

From Rosetta Code
Revision as of 20:59, 15 September 2009 by rosettacode>Mwn3d (Should have been in Ursala cat all along)
Execute HQ9+/Ursala is part of RCHQ9+. You may find other members of RCHQ9+ at Category:RCHQ9+.
Execute HQ9+/Ursala is an implementation of HQ9+. Other implementations of HQ9+.

Unrecognized operators or a missing input file cause diagnostic messages. Since the accumulator is unreadable and has no operational consequences, its value isn't stored. A line break at the end of the file, if any, is ignored.

Ursala

<lang Ursala>

  1. import std
  2. import nat

quantity = ~&iNC+ --' of beer'+ ~&?(

  1?=/'1 bottle'! --' bottles'+ ~&h+ %nP,
  'no more bottles'!)

verse =

^(successor,~&); ("s","n"). -[

  -[quantity "s"]- on the wall, -[quantity "s"]-,
  Take one down and pass it around, -[quantity "n"]- on the wall.]-

refrain "n" =

-[

  No more bottles of beer on the wall, -[quantity 0]-.
  Go to the store and buy some more, -[quantity "n"]- on the wall.]-

whole_song "n" = ~&ittt2BSSL (verse*x iota "n")--<refrain "n">

  1. executable ('parameterized',)

rchq =

<.file$[contents: --<>]>+ -+

  *= case~&r (
     {`h: -[Hello, World!]-!,`9: whole_song99!,`+: <>!,`q: ~&l},
     % <.'unrecognized operator: '--+ ~&rNC>),
  ~command.files; ~&itZB?/~&h.contents.&iziyQBLD <'usage: rchq [file]'>!%+-

</lang>