[#5218] Ruby Book Eng tl, ch1 question — Jon Babcock <jon@...>

13 messages 2000/10/02

[#5404] Object.foo, setters and so on — "Hal E. Fulton" <hal9000@...>

OK, here is what I think I know.

14 messages 2000/10/11

[#5425] Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...>

18 messages 2000/10/11
[#5427] RE: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — OZAWA -Crouton- Sakuro <crouton@...> 2000/10/11

At Thu, 12 Oct 2000 03:49:46 +0900,

[#5429] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...> 2000/10/11

Thanks for the input.

[#5432] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Yasushi Shoji <yashi@...> 2000/10/11

At Thu, 12 Oct 2000 04:53:41 +0900,

[#5516] Re: Some newbye question — ts <decoux@...>

>>>>> "D" == Davide Marchignoli <marchign@di.unipi.it> writes:

80 messages 2000/10/13
[#5531] Re: Some newbye question — matz@... (Yukihiro Matsumoto) 2000/10/14

Hi,

[#5544] Re: Some newbye question — Davide Marchignoli <marchign@...> 2000/10/15

On Sat, 14 Oct 2000, Yukihiro Matsumoto wrote:

[#5576] Re: local variables (nested, in-block, parameters, etc.) — Dave Thomas <Dave@...> 2000/10/16

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#5617] Re: local variables (nested, in-block, parameters, etc.) — "Brian F. Feldman" <green@...> 2000/10/16

Dave Thomas <Dave@thomases.com> wrote:

[#5705] Dynamic languages, SWOT ? — Hugh Sasse Staff Elec Eng <hgs@...>

There has been discussion on this list/group from time to time about

16 messages 2000/10/20
[#5712] Re: Dynamic languages, SWOT ? — Charles Hixson <charleshixsn@...> 2000/10/20

Hugh Sasse Staff Elec Eng wrote:

[#5882] [RFC] Towards a new synchronisation primitive — hipster <hipster@...4all.nl>

Hello fellow rubyists,

21 messages 2000/10/26

[ruby-talk:5962] Re: Hash.new {block} / Hash#default_proc{,_set}

From: "Brian F. Feldman" <green@...>
Date: 2000-10-31 05:12:18 UTC
List: ruby-talk #5962
Woops, here's the new diff...

--- ../ruby-1.6.2/hash.c	Tue Sep 12 01:37:23 2000
+++ hash.c	Mon Oct 30 21:25:28 2000
@@ -18,6 +18,7 @@
 #include "rubysig.h"
 
 #define HASH_DELETED  FL_USER1
+#define HASH_HASPROC  FL_USER2
 
 static void
 rb_hash_modify(hash)
@@ -201,11 +202,17 @@
     VALUE *argv;
     VALUE hash;
 {
-    VALUE ifnone;
+    VALUE ifnone, ifnone_proc;
 
-    rb_scan_args(argc, argv, "01", &ifnone);
+    rb_scan_args(argc, argv, "01&", &ifnone, &ifnone_proc);
     rb_hash_modify(hash);
-    RHASH(hash)->ifnone = ifnone;
+    if (ifnone_proc != Qnil) {
+	FL_SET(hash, HASH_HASPROC);
+	RHASH(hash)->ifnone = ifnone_proc;
+    } else {
+	FL_UNSET(hash, HASH_HASPROC);
+	RHASH(hash)->ifnone = ifnone;
+    }
 
     return hash;
 }
@@ -284,6 +291,15 @@
     return hash;
 }
 
+static VALUE
+rb_hash_get_default(hash)
+    VALUE hash;
+{
+    if (FL_TEST(hash, HASH_HASPROC))
+	return rb_funcall(RHASH(hash)->ifnone, rb_intern("call"), 0);
+    return RHASH(hash)->ifnone;
+}
+
 VALUE
 rb_hash_aref(hash, key)
     VALUE hash, key;
@@ -291,7 +307,9 @@
     VALUE val;
 
     if (!st_lookup(RHASH(hash)->tbl, key, &val)) {
-	return RHASH(hash)->ifnone;
+	if (FL_TEST(hash, HASH_HASPROC))
+	    return rb_hash_aset(hash, key, rb_hash_get_default(hash));
+	return rb_hash_get_default(hash);
     }
     return val;
 }
@@ -330,13 +348,43 @@
 }
 
 static VALUE
+rb_hash_default_proc(argc, argv, hash)
+    int argc;
+    VALUE *argv;
+    VALUE hash;
+{
+    VALUE ifnone_proc;
+
+    rb_scan_args(argc, argv, "0&", &ifnone_proc);
+    if (ifnone_proc != Qnil) {
+	FL_SET(hash, HASH_HASPROC);
+	RHASH(hash)->ifnone = ifnone_proc;
+	return Qtrue;
+    }
+    return FL_TEST(hash, HASH_HASPROC) ? Qtrue : Qfalse;
+}
+
+static VALUE
 rb_hash_set_default(hash, ifnone)
     VALUE hash, ifnone;
 {
+    FL_UNSET(hash, HASH_HASPROC);
     RHASH(hash)->ifnone = ifnone;
     return hash;
 }
 
+static VALUE
+rb_hash_set_default_proc(hash, value)
+    VALUE hash, value;
+{
+    if (value == Qtrue) {
+	FL_SET(hash, HASH_HASPROC);
+	return Qtrue;
+    }
+    FL_UNSET(hash, HASH_HASPROC);
+    return Qfalse;
+}
+
 static int
 index_i(key, value, args)
     VALUE key, value;
@@ -356,7 +404,7 @@
     VALUE args[2];
 
     args[0] = value;
-    args[1] = RHASH(hash)->ifnone;
+    args[1] = rb_hash_get_default(hash);
 
     st_foreach(RHASH(hash)->tbl, index_i, args);
 
@@ -398,7 +446,7 @@
     if (rb_block_given_p()) {
 	return rb_yield(key);
     }
-    return RHASH(hash)->ifnone;
+    return rb_hash_get_default(hash);
 }
 
 struct shift_var {
@@ -430,7 +478,8 @@
     var.stop = 0;
     st_foreach(RHASH(hash)->tbl, shift_i, &var);
 
-    if (var.stop == 0) return RHASH(hash)->ifnone;
+    if (var.stop == 0)
+	return rb_hash_get_default(hash);
     return rb_assoc_new(var.key, var.val);
 }
 
@@ -1422,6 +1471,8 @@
     rb_define_method(rb_cHash,"store", rb_hash_aset, 2);
     rb_define_method(rb_cHash,"default", rb_hash_default, 0);
     rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1);
+    rb_define_method(rb_cHash,"default_proc", rb_hash_default_proc, -1);
+    rb_define_method(rb_cHash,"default_proc=", rb_hash_set_default_proc, 1);
     rb_define_method(rb_cHash,"index", rb_hash_index, 1);
     rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1);
     rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1);


--
 Brian Fundakowski Feldman           \  FreeBSD: The Power to Serve!  /
 green@FreeBSD.org                    `------------------------------'



In This Thread

Prev Next