Two standard libraries?

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sat Jul 28 11:13:24 PDT 2007


renoX wrote:
> Steve Teale a écrit :
>> Sean Kelly Wrote:
>>
>>> Steve Teale wrote:
>>>> It seemes to me that given Walter's definition of the language - a 
>>>> system programming language - that Phobos is closer to the mark.  If 
>>>> users want a more object oriented standard library, that's all well 
>>>> and good, but it should be a shoe-in, then if you want to use the OO 
>>>> stuff you can, but code that's been written to work with Phobos 
>>>> should work unmodified with other libraries.  (Note the recent 
>>>> discussion on C++ security).
>>> While one might argue that it is easier to wrap a strictly procedural 
>>> library with an OO layer than vice-versa, I think the ease with which 
>>> any library may be encapsulated in a wrapper is more dependent on its 
>>> design (the assumptions it makes, how features are exposed, etc) than 
>>> on whether the interface uses functions or objects.  That said, I 
>>> don't personally consider Tango to be an object-oriented library 
>>> because it does not require the user to define his own objects in 
>>> order to use it.
>>>
>>>
>>> Sean
>>
>> Sean, I take your point, and maybe should not have used the term "OO", 
>> but my idea of progress is:
>>
>> printf("X is: %s\n", toStringz(x))
>> cout << "X is: " << x << endl;
>> Stdout("X is: ")(x).newline;
>> writefln("X is: %s", x);
> 
> I agree with you that cout or Stdout strike me as particularly ugly and 
> that writefln is a (small) progress over printf.
> 
> But when I see Ruby's way: puts("X is ${X}\n"); I can't help but feeling 
> that even writefln is not enough..
> 
> renoX
> 

Technically the Ruby sample would usually just be:
puts "X is #{X}"

Which is essentially shorthand for:
$stdout.method(:puts).call('X is ' + X.method(:to_s).call());

And if you need to format X any at all, you'd use something like this:
puts 'X is %08x' % [X]

Which is shorthand for:
$stdout.method(:puts).call('X is %08x'.method(:"%").call(X));

Which is a wrapper around:
puts sprintf('X is %08x', X)

Aka:
$stdout.method(:puts).call(Kernel::sprintf('X  is %08x', X));

Uhm.... sorry, got a little carried away there.  ;)  But the main point 
was, in cases like this Ruby and D don't really compare -- what with the 
former being in a virtual environment and the latter a systems language 
meant to expose metal.  For something like "X is #{X}" to work in D, 
wouldn't really require very much (symbol table, and runtime function to 
do the insertions) but the cost of such a thing becoming "mandatory" 
would be great.

I'd happily settle for a template or CTF that takes that string as 
parameter, and spits out an appropriate use of Stdout/writef.

On a side note, call me when we can duplicate this Ruby in D:

+-----[ Ruby ]-----------------------------------+
|
|    def verb_arg_str (flags, which)
|        ['none', 'any', 'this'][(flags >> case which
|            when :dobj then VFSHIFT_DOBJ
|            when :iobj then VFSHIFT_IOBJ
|        end) & VFMASK_ARGS]
|    end
|_________________________________________________

Er... actually we can, sans the symbol type in favor of a bool:

+-----[ D ]--------------------------------------+
|
|    char[] verbArgStr (uint flags, bool dobj) {
|      return ["none"[], "any", "this"][
|        (flags >> (dobj ? VFSHIFT_DOBJ : VFSHIFT_IOBJ))
|        & VFMASK_ARGS
|      ];
|    }
|_________________________________________________

Huh, how about that.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list