[#14690] singleton-of-singleton is Class in 1.9.0 — Sylvain Joyeux <sylvain.joyeux@...4x.org>
In 1.9.0, the singleton of a singleton is Class, while in 1.8 it was a
[#14696] Inconsistency in rescuability of "return" — Charles Oliver Nutter <charles.nutter@...>
Why can you not rescue return, break, etc when they are within
Gary Wright wrote:
On Jan 3, 2008 12:53 AM, Gary Wright <gwtmp01@mac.com> wrote:
Gary Wright wrote:
On Jan 2, 2008 5:26 PM, Charles Oliver Nutter <charles.nutter@sun.com> wrote:
[#14720] bug reports about 1.9 VM — SASADA Koichi <ko1@...>
Hi,
[#14738] Enumerable#zip Needs Love — James Gray <james@...>
The community has been building a Ruby 1.9 compatibility tip list on
Hello James,
On Jan 4, 2008, at 12:11 AM, Martin Duerst wrote:
Hi,
On Jan 7, 2008, at 8:07 PM, Yukihiro Matsumoto wrote:
Hi,
On Jan 7, 2008, at 11:06 PM, Yukihiro Matsumoto wrote:
Hi,
[#14740] Could someone sanity check a paragraph? — Dave Thomas <dave@...>
In the section on writing C extensions for Ruby, I'm talking about
[#14747] BasicObject.instance_eval — Sam Ruby <rubys@...>
I'm looking at converting some code over from BlankSlate to BasicObject,
On Jan 3, 2008 10:06 PM, Sam Ruby <rubys@intertwingly.net> wrote:
[#14772] Manual Memory Management — Pramukta Kumar <prak@...>
I was thinking it would be nice to be able to free large objects at
On Jan 4, 2008 1:25 PM, Pramukta Kumar <prak@fortiusone.com> wrote:
I would only like to add that RMgick for example provides free method to
Marcin Raczkowski wrote:
On Sat, 5 Jan 2008 15:49:30 +0900, Marcin Raczkowski <mailing.mr@gmail.com> wrote:
Python supports 'del reference', which decrements the reference
Evan Weaver wrote:
On Tue, 8 Jan 2008 14:35:28 +0900, Marcin Raczkowski <mailing.mr@gmail.com> wrote:
[#14811] Re: Experimental PATCH to improve thread performance — Brent Roman <brent@...>
Paul,
[#14813] Changes in block_given? in 1.9 — Tomas Matousek <Tomas.Matousek@...>
The following code output differs between 1.8 and 1.9:
[#14816] Fibers clear thread-specific data? — "Tony Arcieri" <tony@...>
Is this behavior intentional?
On Mon, 7 Jan 2008 09:34:35 +0900, "Tony Arcieri" <tony@clickcaster.com> wrote:
On Jan 7, 2008 1:29 PM, MenTaLguY <mental@rydia.net> wrote:
On Tue, 2008-01-08 at 11:12 +0900, Tony Arcieri wrote:
[#14829] Finding I need explicit "GC.start" in my programs to prevent extreme growth. — Ron Mayer <rm_rails@...>
Short summary:
[#14839] Re: Embedding 1.9 — Dave Thomas <dave@...>
Moved over from ruby-talk...
Dave Thomas wrote:
On Wed, Jan 09, 2008 at 02:04:03AM +0900, Dave Thomas wrote:
[#14845] Some (accidental?) syntax changes 1.8 -> 1.9 — "Florian Frank" <flori@...>
Hello,
[#14871] p returning its argument? — "David A. Black" <dblack@...>
Hi --
On Jan 9, 2008 1:14 AM, David A. Black <dblack@rubypal.com> wrote:
[#14877] Array#count returning an enumerator — "David A. Black" <dblack@...>
Hi --
[#14884] memory leak? — ara howard <ara.t.howard@...>
Hi,
[#14885] Segmentation fault when calling procs — Chris "ク" Heath <chris@...>
Hi,
[#14911] Draft of some pages about encoding in Ruby 1.9 — Dave Thomas <dave@...>
Folks:
Hi,
Hello Dave,
>
Hi,
Hi,
[#14943] Re: Really strange GC behaviour: Was [BUG] memory leak? — ara howard <ara.t.howard@...>
[#14959] 1.9 RI blowing up, not sure where to report it. — "Rick DeNatale" <rick.denatale@...>
It's unclear to me whether or not the tracker on Rubyforge is still
Rick DeNatale wrote:
[#14965] Before I create a ticket — Dave Thomas <dave@...>
Is it reasonable to expect the following to produce differing counts
[#14976] nil encoding as synonym for binary encoding — David Flanagan <david@...>
The following just appeared in the ChangeLog
Hi,
Dave Thomas wrote:
Dave Thomas schrieb:
Hi,
Yukihiro Matsumoto writes:
Hi,
Yukihiro Matsumoto wrote:
Hi,
Yukihiro Matsumoto wrote:
David Flanagan wrote:
[#15044] Build failures 15007-15013 — Sam Ruby <rubys@...>
Just FYI, starting with 15007, I am not able to do a successful build.
[#15050] how to "borrow" the RDoc::RubyParser and HTMLGenerator — Phlip <phlip2005@...>
Core Rubies:
On Jan 13, 2008, at 08:54 AM, Phlip wrote:
Eric Hodel wrote:
On Jan 13, 2008, at 20:35 PM, Phlip wrote:
Eric Hodel wrote:
On Jan 15, 2008, at 18:19 PM, Phlip wrote:
Eric Hodel wrote:
On Jan 16, 2008, at 15:01 PM, Phlip wrote:
Eric Hodel wrote:
On Jan 17, 2008, at 17:57 PM, Phlip wrote:
Eric Hodel wrote:
[#15056] How to use "addr2line" — SASADA Koichi <ko1@...>
Hi,
[#15069] native_mutex_destroy return non-zero: 16 — Sam Ruby <rubys@...>
Yesterday, I got ruby-openid to work with Ruby 1.9, rev 15006
Hi,
[#15083] Why @hash ||= Hash.new in Set#initialize? — "David A. Black" <dblack@...>
Hi --
[#15092] Module/Class definitions cannot take non literal blocks — "Robert Dober" <robert.dober@...>
Hi list
Hi --
On Jan 16, 2008 1:23 PM, David A. Black <dblack@rubypal.com> wrote:
[#15098] Bug in Date::Infinity#<=> — Dirkjan Bussink <d.bussink@...>
Hi all,
[#15102] REXML::Element.write is deprecated. See REXML::Formatters — Phlip <phlip2005@...>
okay, I saw them. Now what?
Phlip wrote:
> Meanwhile try something like the following:
Phlip wrote:
> I guess I'll let Sean take it from here, other than to note that .to_s
[#15131] test/rdoc/test_simple_markup_attribute_manager.rb:2:in `require': no such file to load -- rdoc/markup/simple_markup/inline (LoadError) — Tanaka Akira <akr@...>
test-all failed as follows.
> test-all failed as follows.
[#15143] Build error, revisions 15119-15126 — Sam Ruby <rubys@...>
This change:
[#15147] String initialziation — Marcin Raczkowski <mailing.mr@...>
Mayby strange question but what happens when someone for example types
Marcin Raczkowski pisze:
Gary Wright wrote:
Marcin Raczkowski schrieb:
> What's your use case? Just curious.
[#15155] an example of performance improvements — Martin Duerst <duerst@...>
For those not reading ruby-dev, I just wanted to point to
[#15164] convert rubynode transforms back into source code? — Phlip <phlip2005@...>
Rubiods:
[#15185] Friendlier methods to compare two Time objects — "Jim Cropcho" <jim.cropcho@...>
Hello,
At 05:42 08/01/23, Kornelius Kalnbach wrote:
Hi,
A new thought:
[#15194] Can large scale projects be successful implemented around a dynamic programming language? — Jordi <mumismo@...>
A good article I have found (may have been linked by slashdot, don't know)
On Thu, 24 Jan 2008 23:17:34 +0900, James Gray wrote:
Jay Levitt wrote:
Kurt Stephens wrote:
[#15199] Two build issues — Dave Thomas <dave@...>
1. If the directory pointed to by --prefix is a symbolic link, then
[#15212] case when syntax changed ??? — "Yvon Thoraval" <yvon.thoraval@...>
did the case when syntax changed with 1.9 ???
[#15217] ruby-1.9.0-0 and Tk — "Yvon Thoraval" <yvon.thoraval@...>
I had successfully tested ruby 1.9 (early december 2007) with Tk, but right
[#15234] Gem install error on head — Dave Thomas <dave@...>
I built HEAD into a totally clean destination (so there were no
On 27/01/2008, Dave Thomas <dave@pragprog.com> wrote:
[#15236] Encoding of unicode strings is now ASCII-8BIT? — Sam Ruby <rubys@...>
Before:
[#15238] CI for Ruby core? — Charles Oliver Nutter <charles.nutter@...>
Perhaps it's time to set up a continuous integration server for ruby
Charles Oliver Nutter wrote:
On Jan 27, 2008 4:01 PM, M. Edward (Ed) Borasky <znmeb@cesmail.net> wrote:
[#15248] Symbol#empty? ? — "David A. Black" <dblack@...>
Hi --
Hi,
[#15257] a new kind of assertion — Phlip <phlip2005@...>
Ruby-core:
On Jan 28, 2008 5:45 AM, Phlip <phlip2005@gmail.com> wrote:
Meinrad Recheis wrote:
+1
Jim Cropcho wrote:
[#15288] Circular dependency: revision 15317 — Sam Ruby <rubys@...>
http://intertwingly.net/projects/ruby19/logs/ruby.html
[#15297] Deletion of element sequence in an Array — Wolfgang Nádasi-Donner <ed.odanow@...>
Hi!
[#15303] Core team, I need your help — "Jonas Pfenniger" <zimbatm@...>
Hi,
[#15308] IRHG - TNODE Documentation? — Charles Thornton <ceo@...>
Is there any documentation on the TNODE
On Wed, Jan 30, 2008 at 03:42:29PM +0900, Charles Thornton wrote:
Re: [PATCH] Friendlier methods to compare two Time objects
Here is the newest patch. It creates a module called Temporal which contains functionality useful to classes which define temporal objects, such as dates and times. However, its intended scope is *not* limited to object comparison. It is handy in this regard, though, because it addresses differences between languages, as several in this thread have noted. The module is added to the compilation configuration, and unit tests are included, all of which pass. The module is included in the classes Time and Date (and DateTime, via extension). The module does not include the methods past? and present?, as intended, because the means of determining "now" is different even at the conceptual level between temporal classes. For example, "now" to Time is the number of microseconds after epoch, but "now" to Date is the current calendar date. It is my opinion that past?/future? functionality should be implemented at the class level. Please give my concept and source code consideration for being entered into the ruby core, and suggest modifications/additions at will. Jim Cropcho 2008/1/23 Jim Cropcho <jim.cropcho@gmail.com>: > A new thought: > > > The way that the <=> method is rewritten for Time, it is > > optimized (as far as I can tell) to evaluate conditions > > based on nanoseconds only when equality cannot be > > determined via seconds. I may be misreading that. > > > > Conversely, Time inherits its > and < methods from its superclass, > > so surely those optimizations in <=> do not exist, and creating > > aliases would yield less-optimized code. Also, in the other classes > > where I add this functionality, current techniques to optimize > > comparisons will be reimplemented using the local methodology. > > from the rdoc for compar.c: > > The Comparable <http://ruby-doc.org/core/classes/Comparable.html> mixin is > used by classes whose objects may be ordered. The class must define the > <=> operator, which compares the receiver against another object, > returning -1, 0, or +1 depending on whether the receiver is less than, equal > to, or greater than the other object. Comparable<http://ruby-doc.org/core/classes/Comparable.html>uses > <=> to implement the conventional comparison operators (<, <=, ==, >=, and > >) and the method between?<http://ruby-doc.org/core/classes/Comparable.html#M007548> > . > > I am now writing a Mixin called Temporal which will be included in the > Time , Date and DateTime classes, and will contain the instance methods > > *before?(some_time) > *after?(some_time) > *future?(time = Time.now) > *past?(time = Time.now) > > I have the tests written and skeleton code to compile and include the > module where necessary. I hope to be finished tomorrow. > > 2008/1/23 Mathieu Blondel < mblondel@rubyforge.org >: > > > Hi, > > > > 2008/1/23, Martin Duerst < duerst@it.aoyama.ac.jp>: > > > > > There is even some cultural dependency here. In Japanese, for example, > > > the past is higher than the future, time flows down, > > > > And in Chinese as well. For example: > > > > 下个星期 = next week, lit. below week > > 上个星期 = last week, lit. above week > > > > > > Mathieu > > > > >
Attachments (1)
Index: time.c
===================================================================
--- time.c (revision 15221)
+++ time.c (working copy)
@@ -2332,6 +2332,7 @@
rb_cTime = rb_define_class("Time", rb_cObject);
rb_include_module(rb_cTime, rb_mComparable);
+ rb_include_module(rb_cTime, rb_mTemporal);
rb_define_alloc_func(rb_cTime, time_s_alloc);
rb_define_singleton_method(rb_cTime, "now", rb_class_new_instance, -1);
Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h (revision 15221)
+++ include/ruby/intern.h (working copy)
@@ -567,6 +567,8 @@
VALUE rb_barrier_new(void);
VALUE rb_barrier_wait(VALUE self);
VALUE rb_barrier_release(VALUE self);
+/* temporal.c */
+int rb_temporalint(VALUE, VALUE, VALUE);
/* time.c */
VALUE rb_time_new(time_t, long);
VALUE rb_time_nano_new(time_t, long);
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h (revision 15221)
+++ include/ruby/ruby.h (working copy)
@@ -817,6 +817,7 @@
RUBY_EXTERN VALUE rb_mGC;
RUBY_EXTERN VALUE rb_mMath;
RUBY_EXTERN VALUE rb_mProcess;
+RUBY_EXTERN VALUE rb_mTemporal;
RUBY_EXTERN VALUE rb_cBasicObject;
RUBY_EXTERN VALUE rb_cObject;
Index: temporal.c
===================================================================
--- temporal.c (revision 0)
+++ temporal.c (revision 0)
@@ -0,0 +1,103 @@
+/**********************************************************************
+
+ temporal.c -
+
+ $Author: akr $
+ created at: Wed 23 Jan 2008
+
+ code and documentation by Jim Cropcho <jim.cropcho@gmail.com>,
+ with sections adapted from <compar.c>
+
+**********************************************************************/
+
+#include "ruby/ruby.h"
+
+VALUE rb_mTemporal;
+
+static ID spaceship;
+
+int
+rb_temporalint(VALUE val, VALUE a, VALUE b)
+{
+ if (NIL_P(val)) {
+ rb_temporalerr(a, b);
+ }
+ if (FIXNUM_P(val)) return FIX2INT(val);
+ if (TYPE(val) == T_BIGNUM) {
+ if (RBIGNUM_SIGN(val)) return 1;
+ return -1;
+ }
+ if (RTEST(rb_funcall(val, '>', 1, INT2FIX(0)))) return 1;
+ if (RTEST(rb_funcall(val, '<', 1, INT2FIX(0)))) return -1;
+ return 0;
+}
+
+void
+rb_temporalerr(VALUE x, VALUE y)
+{
+ const char *classname;
+
+ if (SPECIAL_CONST_P(y)) {
+ y = rb_inspect(y);
+ classname = StringValuePtr(y);
+ }
+ else {
+ classname = rb_obj_classname(y);
+ }
+ rb_raise(rb_eArgError, "comparison of %s with %s failed",
+ rb_obj_classname(x), classname);
+}
+
+/*
+ * call-seq:
+ * obj.before?(other)
+ *
+ * Return <code>true</code> if <i>time</i> is before <i>other_time</i>, or
+ * <code>false</code> if after or the same time as <i>other_time</i>.
+ */
+
+static VALUE
+temporal_before_p(VALUE x, VALUE y)
+{
+ VALUE c = rb_funcall(x, spaceship, 1, y);
+
+ if (rb_temporalint(c, x, y) < 0) return Qtrue;
+ return Qfalse;
+}
+
+/*
+ * call-seq:
+ * obj.after?(other)
+ *
+ * Return <code>true</code> if <i>time</i> is after <i>other_time</i>, or
+ * <code>false</code> if before or the same time as <i>other_time</i>
+ */
+
+static VALUE
+temporal_after_p(VALUE x, VALUE y)
+{
+ VALUE c = rb_funcall(x, spaceship, 1, y);
+
+ if (rb_temporalint(c, x, y) > 0) return Qtrue;
+ return Qfalse;
+}
+
+/*
+ * The <code>Temporal</code> mixin contains functionality useful to classes
+ * which define temporal objects, such as dates and times. As with the <code>Comparable</code
+ * mixin, the class must define the <code><=></code> operator. <code>Temporal</code>
+ * uses <code><=></code> to implement the comparison operators <code>before?</code>
+ * and <code>after?</code>, although its intended scope is not limited to object comparison.
+ *
+ * earlier_temporal_object.before? later_temporal_object # => true
+ * earlier_temporal_object.after? later_temporal_object # => false
+ */
+
+void
+Init_Temporal(void)
+{
+ rb_mTemporal = rb_define_module("Temporal");
+ rb_define_method(rb_mTemporal, "before?", temporal_before_p, 1);
+ rb_define_method(rb_mTemporal, "after?", temporal_after_p, 1);
+ spaceship = rb_intern("<=>");
+}
Index: lib/date.rb
===================================================================
--- lib/date.rb (revision 15221)
+++ lib/date.rb (working copy)
@@ -226,10 +226,13 @@
#
# The Date class includes the Comparable module, allowing
# date objects to be compared and sorted, ranges of dates
-# to be created, and so forth.
+# to be created, and so forth. The Temporal object is also
+# included to allow date objects to be compared using more
+# natural language.
class Date
include Comparable
+ include Temporal
# Full month names, in English. Months count from 1 to 12; a
# month's numerical representation indexed into this array
Index: common.mk
===================================================================
--- common.mk (revision 15221)
+++ common.mk (working copy)
@@ -58,6 +58,7 @@
st.$(OBJEXT) \
string.$(OBJEXT) \
struct.$(OBJEXT) \
+ temporal.$(OBJEXT) \
time.$(OBJEXT) \
transcode.$(OBJEXT) \
util.$(OBJEXT) \
@@ -571,6 +572,9 @@
struct.$(OBJEXT): {$(VPATH)}struct.c {$(VPATH)}ruby.h {$(VPATH)}config.h \
{$(VPATH)}defines.h {$(VPATH)}missing.h {$(VPATH)}intern.h \
{$(VPATH)}st.h
+temporal.$(OBJEXT): {$(VPATH)}temporal.c {$(VPATH)}ruby.h {$(VPATH)}config.h \
+ {$(VPATH)}defines.h {$(VPATH)}missing.h {$(VPATH)}intern.h \
+ {$(VPATH)}st.h
thread.$(OBJEXT): {$(VPATH)}thread.c {$(VPATH)}eval_intern.h \
{$(VPATH)}ruby.h {$(VPATH)}config.h {$(VPATH)}defines.h \
{$(VPATH)}missing.h {$(VPATH)}intern.h {$(VPATH)}st.h {$(VPATH)}node.h \
Index: inits.c
===================================================================
--- inits.c (revision 15221)
+++ inits.c (working copy)
@@ -43,6 +43,7 @@
void Init_signal(void);
void Init_String(void);
void Init_Struct(void);
+void Init_Temporal(void);
void Init_Time(void);
void Init_var_tables(void);
void Init_version(void);
@@ -82,6 +83,7 @@
Init_Range();
Init_IO();
Init_Dir();
+ Init_Temporal();
Init_Time();
Init_Random();
Init_signal();
Index: test/ruby/test_temporal.rb
===================================================================
--- test/ruby/test_temporal.rb (revision 0)
+++ test/ruby/test_temporal.rb (revision 0)
@@ -0,0 +1,66 @@
+require 'test/unit'
+require 'date'
+
+class TimeClassExtensionsTest < Test::Unit::TestCase
+
+ def test_before
+ old_time = Time.now - 1000
+ less_old_time = Time.now - 15
+ assert old_time.before?(less_old_time)
+ end
+
+ def test_after
+ future_time = Time.now + 2
+ distant_future = Time.now + 20_000
+ assert distant_future.after?(future_time)
+ end
+
+ def test_equal
+ time1 = Time.now
+ time2 = time1.clone
+ assert !time1.before?(time2)
+ assert !time1.after?(time2)
+ end
+end
+
+class DateClassExtensionsTest < Test::Unit::TestCase
+ def test_before
+ old_time = Date.today - 1000
+ less_old_time = Date.today - 15
+ assert old_time.before?(less_old_time)
+ end
+
+ def test_after
+ future_time = Date.today + 2
+ distant_future = Date.today + 20000
+ assert distant_future.after?(future_time)
+ end
+
+ def test_equal
+ time1 = Date.today
+ time2 = time1.clone
+ assert !time1.before?(time2)
+ assert !time1.after?(time2)
+ end
+end
+
+class DateTimeClassExtensionsTest < Test::Unit::TestCase
+ def test_before
+ old_time = DateTime.now - 1000
+ less_old_time = DateTime.now - 15
+ assert old_time.before?(less_old_time)
+ end
+
+ def test_after
+ future_time = DateTime.now + 2
+ distant_future = DateTime.now + 20000
+ assert distant_future.after?(future_time)
+ end
+
+ def test_equal
+ time1 = DateTime.now
+ time2 = time1.clone
+ assert !time1.before?(time2)
+ assert !time1.after?(time2)
+ end
+end