]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/dice/dice.factor
factor: trim using lists
[factor.git] / extra / dice / dice.factor
index d12939f91ea220bd92e65fff148c8fe066e4d4c7..5f93a1d7cf9bacf193c726ae7790ac62f2df2420 100644 (file)
@@ -1,24 +1,29 @@
 ! Copyright (C) 2010 John Benediktsson
 ! See http://factorcode.org/license.txt for BSD license
-
-USING: fry kernel lexer macros math math.parser peg.ebnf random
-sequences strings ;
-
+USING: kernel lexer math math.parser namespaces
+random random.private sequences splitting ;
 IN: dice
 
-EBNF: parse-roll
+: (random-roll) ( #dice #sides obj -- n )
+    [ 0 ] 3dip '[ _ _ (random-integer) + 1 + ] times ;
+
+: random-roll ( #dice #sides -- n )
+    random-generator get (random-roll) ;
 
-number = ([0-9])+    => [[ >string string>number ]]
-dice   = "d" number  => [[ second '[ _ random ] ]]
-roll   = number dice => [[ first2 '[ 0 _ [ @ + 1 + ] times ] ]]
-added  = "+" number  => [[ second '[ _ + ] ]]
-total  = roll added? => [[ first2 [ append ] when* ]]
-error  = .*          => [[ "unknown dice" throw ]]
-rolls  = total | error
+: random-rolls ( length #dice #sides -- seq )
+    random-generator get '[ _ _ _ (random-roll) ] replicate ;
 
-;EBNF
+: parse-roll ( string -- #dice #sides #added )
+    "d" split1 "+" split1 [ string>number ] tri@ ;
 
-MACRO: roll ( string -- ) parse-roll ;
+: roll ( string -- n )
+    parse-roll [ random-roll ] dip [ + ] when* ;
 
-SYNTAX: ROLL: scan-token parse-roll append ;
+: roll-quot ( string -- quot: ( -- n ) )
+    parse-roll [
+        '[ _ _ random-roll _ + ]
+    ] [
+        '[ _ _ random-roll ]
+    ] if* ;
 
+SYNTAX: ROLL: scan-token roll-quot append! ;