Well, I don't know if this is interesting, but here's a patch that implement:
   op rand(out NUM)
   op rand(out NUM, in INT)

and does what you can guess. There's also a test file (I don't know wether 
the tests should go in an existant test file).

But, there is a tiny, little problem: I don't call srand(), and thus get 
always the same value. I don't know *where* to call srand(). I don't even 
know *if* I should call srand().
Anyway, here's the patch and be kind since this is my first patch ;) (pod 
cleaning doesn't count).

Please, could you tell me if the parrot team (that is, all of you guys) wants 
to add new ops, or if we should wait for a new source organization / 
extension API / etc.

This makes me think: I looked for the ord() and chr() functions, and found 
just the ord() in core.ops, that calls string_ord() in string.c. I wanted to 
code the chr() function, but I realized that it depends in fact from the 
encoding? How one should treat this?

Jerome 
-- 
[EMAIL PROTECTED]
diff -urbN parrot.orig/core.ops parrot/core.ops
--- parrot.orig/core.ops	Mon Aug 12 17:00:08 2002
+++ parrot/core.ops	Tue Aug 13 23:22:21 2002
@@ -4055,6 +4055,30 @@
 
 ########################################
 
+=item B<rand>(out NUM)
+
+Put a fractionnal random value greater than or equal to "0" and less
+than 1 into $1.
+
+=item B<rand>(out NUM, in INT)
+
+Put a random fractional number greater than or equal to "0" and less
+than $2 into $1.  ($2 should be positive.)
+
+=cut
+
+inline op rand(out NUM) {
+    $1 = (FLOATVAL) rand() / ((FLOATVAL)RAND_MAX+1);
+    goto NEXT();
+}
+
+inline op rand(out NUM, in INT) {
+    $1 = (FLOATVAL) rand() / ((FLOATVAL)RAND_MAX+1) * $2;
+    goto NEXT();
+}
+
+########################################
+
 =item B<sleep>(in INT)
 
 Sleep for $1 seconds.
diff -urbN parrot.orig/t/op/rand.t parrot/t/op/rand.t
--- parrot.orig/t/op/rand.t	Thu Jan  1 01:00:00 1970
+++ parrot/t/op/rand.t	Tue Aug 13 23:19:42 2002
@@ -0,0 +1,45 @@
+#! perl -w
+
+use Parrot::Test tests => 2;
+
+output_is(<<'CODE', <<'OUTPUT', "rand");
+        rand    N0
+        ge      N0, 0.0, OK1
+        branch  FAIL
+OK1:	print "ok, rand is greater or equal than 0.0\n"
+        lt	N0, 1.0, OK2
+	branch	FAIL
+OK2:	print "ok, rand is less than 1.0\n"
+	branch	OK_ALL
+FAIL:	print "failure\n"
+	print "N0 was: "
+	print N0
+	print "\n"
+OK_ALL:
+	end
+CODE
+ok, rand is greater or equal than 0.0
+ok, rand is less than 1.0
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "rand_n");
+        rand N0, 10
+        ge      N0, 0.0,  OK1
+        branch  FAIL
+OK1:	print "ok, rand is greater or equal than 0.0\n"
+	lt	N0, 10.0, OK2
+	branch	FAIL
+OK2:	print "ok, rand is less than 10.0\n"
+	branch	OK_ALL
+FAIL:	print "failure\n"
+	print "N0 was: "
+	print N0
+	print "\n"
+OK_ALL:
+	end
+CODE
+ok, rand is greater or equal than 0.0
+ok, rand is less than 10.0
+OUTPUT
+
+1;

Reply via email to