.toString() method works on objects only. printing time and duration is always a little more work.
fun void printTime(time t)
{
<<< t/second, "::second" >>>;
}
printTime(now);
or for durations, you can do the same kind of thing:
fun void printTime(dur t)
{
<<< t/second, "::second" >>>;
}
printTime(400::ms);
this is generally what i do when i need to know print this kind of information.
-mike
Sorry, yeah, the short answer is that there doesn't seem to be a good
way to do what you're trying to do.
If you want to see what Chuck does with "<<<" and ">>>", take a look
at Chuck_Instr_Hack::execute( Chuck_VM * vm, Chuck_VM_Shred * shred )
in chuck_instr.cpp for the details. There really isn't much in the way
of conversion, it just uses fprintf to print a double.
andy
On Sat, Jan 9, 2010 at 2:27 PM, Robert Poor <rdpoor@gmail.com> wrote:
> Andrew: Yep, I'd come up with the same thing: dedicated functions to
> convert times and durations into strings. That works fine, but my
> question was actually simpler, and I apologize for not making it
> clear. What I should have said:
>
> "It's clear that there are internal functions for converting times and
> durations into strings, used in constructs such as:
> <<< now, 1::second >>>;
> Are those internal functions available?"
>
> ... and I'm guessing the answer is simply "no". Your suggested
> solution will do the job just fine (though I'd follow ChucK's lead and
> print everything in terms of samples). Thanks!
>
> - Rob
>
> On Sat, Jan 9, 2010 at 14:11, Andrew Turley <aturley@acm.org> wrote:
>> So are you looking for something like this?
>>
>> fun void log(string s) {
>> <<<s>>>;
>> }
>>
>> fun string stringify(dur d) {
>> return "" + ((d / (1::second))) + " seconds";
>> }
>>
>> fun string stringify(time t) {
>> return "" + ((t / (1::second))) + " seconds";
>> }
>>
>> 1::second => dur d1;
>> log("d1 is " + stringify(d1)); // "d1 is 1 seconds"
>> 300::samp => dur d2;
>> log("d2 is " + stringify(d2)); // "d2 is 0.0068 seconds"
>>
>> now + 60::second => time t1;
>> log("t1 is " + stringify(t1)); // "t1 is 60 seconds"
>> now + 1::minute => time t2;
>> log("t2 is " + stringify(t2)); // "t2 is 60 seconds"
>>
>> Or are you trying to do something else?
>>
>> Understand that times are represented as a delta of the number of
>> samples since the VM (or maybe it's the shred) started executing.
>> Again, the time itself doesn't carry any information about how it was
>> created, so these two times would have the same representation if they
>> were created at the same time:
>>
>> now + 1::minute => time t1;
>> now + 60::second => time t2;
>>
>> And these two times have different representations since they are not
>> created at the same time:
>>
>> now + 1::minute => time t1;
>> 5::second => now;
>> now + 60::second => time t2;
>>
>> andy
>>
>> On Sat, Jan 9, 2010 at 1:16 PM, Robert Poor <rdpoor@gmail.com> wrote:
>>> Sure, can do, but this is only for debugging -- I'd welcome a means to
>>> get the same effect as
>>> <<< "duration is", d >>>;
>>> which obviously works, but not as a string. Same comments apply for
>>> stringifying a time value.
>>>
>>> - Rob
>>>
>>> On Sat, Jan 9, 2010 at 13:08, Andrew Turley <aturley@acm.org> wrote:
>>>> Are you looking for a way to generate something that would ultimately
>>>> generate a string that contains "1::second"? Because if that's the
>>>> case, you probably can't do it. Durations ultimately get stored as
>>>> floats that represent the number of samples in the duration. And they
>>>> don't, as far as I know, retain any information about the units that
>>>> were used when they were created. So 6::second and 0.1::minute will
>>>> both be stored as the number of samples that are contained in a 6
>>>> second interval.
>>>>
>>>> Now, what you can do is convert the duration to a float by doing this:
>>>>
>>>> 1::second => dur d;
>>>> d / (1::samp) => float dSamp;
>>>>
>>>> And then you could convert that float to a string. Now what you
>>>> probably want is a duration in terms of time rather than samples, so
>>>> you could also get the number of samples per second and divide dSamp
>>>> by that number, and then store your duration as a string
>>>> representation of a floating point number represented in terms of
>>>> seconds (or maybe you want milliseconds).
>>>>
>>>> andy
>>>>
>>>> On Sat, Jan 9, 2010 at 12:50 PM, Robert Poor <rdpoor@gmail.com> wrote:
>>>>> How can I cast a duration into a string (e.g. for passing as a string
>>>>> argument)? Consider:
>>>>>
>>>>> // =============
>>>>> fun void log(string message) {
>>>>> // do something to log the message
>>>>> }
>>>>>
>>>>> 1::second => dur d;
>>>>> log("the duration is " + d); // fails with "cannot perform '+' on
>>>>> object references"
>>>>> log("the duration is " + d.toString()); // fails with "type 'dur' does
>>>>> not have members"
>>>>> // =============
>>>>>
>>>>> Same question for time objects.
>>>>>
>>>>> TIA.
>>>>>
>>>>> - Rob
>>>>> _______________________________________________
>>>>> chuck-users mailing list
>>>>> chuck-users@lists.cs.princeton.edu
>>>>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>>>>>
>>>> _______________________________________________
>>>> chuck-users mailing list
>>>> chuck-users@lists.cs.princeton.edu
>>>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>>>>
>>>
>>
> _______________________________________________
> chuck-users mailing list
> chuck-users@lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>
_______________________________________________
chuck-users mailing list
chuck-users@lists.cs.princeton.edu
https://lists.cs.princeton.edu/mailman/listinfo/chuck-users