Default clock for .fork?

Hi list,

just a quick one: Is the default clock for {}.fork TempoClock.default?
This is not entirely clear from the docs to me.

thanks!
Peter

You need (just a little bit) detective work here.

First, with the cursor in the work “fork” hit cmd-i (or ctrl-i) and you get something like this:

Because a default argument is not defined anywhere here, it must be in Routine. Hit cmd-i on “play” and you get this horribly long list, and knowing that Routine is a Stream, you find this:

So the answer is TempoClock.default.

But if you don’t already know which play method it will be in, this is tricky!

For that, you can use an inspection method:

Routine.findRespondingMethodFor(\play); // returns -> Stream:play

Then you can select “Stream:play” and again hit cmd-i.

1 Like

The idea of a primary class browser where all the detective work could take place never took over sc?

Thanks Julian for this nice and detailed description of solving similar
questions by myself in the future!
Oh, note that screenshots are not forwarded to recipients of this list in
email mode (like me).

all the best,
Peter

There is a searchable class browser, though it doesn’t show everything for this question. Features could be added to it if someone has the time or inclination. Finding both of those is the tricky part, isn’t it.

hjh

1 Like

Here is an interesting dicovery: when you write

Routine:play

select it, and then hit cmd-i it finds the responding method (Stream::play).

1 Like

Curious: Some people are reviving ideas, including this for vscode inspired by SmallTalk’s Class Browser.

https://www.reddit.com/r/vscode/comments/w4afh5/extension_class_browser_in_vscode_inspired_by/

Maybe we’ll come full circle, and the SuperCollider vscode plugins will use some of this work. The prophecy would be fulfilled with SC3 with an IDE experience closer to the Smalltalk environment. ))

// we could make a shortcut that finds it, a bit hacky, but maybe it works …
(
f = { |str|
	var classi, i, classname, methodname, class;
	
	i = str.detectIndex { |c| c.isUpper };
	if(i.notNil) { 
		str = str[i..]; 
		i = str.detectIndex { |c| c.isAlphaNum.not } ?? { str.lastIndex };
		classname = str[..i-1];
		i = str.find(".");
		if(i.notNil) {
			i = i + 1;
			if(str[i] == $() { methodname = "value" };
			str = str[i..];
			str.postln;
			i = str.detectIndex { |c| c.isAlphaNum.not } ?? { str.lastIndex };
			methodname = str[..i-1];
		};
	};
	[classname, methodname].join(":")
	
		
};
f.("	^Routine(this, stackSize).play(clock, quant);")
)
1 Like

It works! Well done, very useful. It looks like an emacs function; except you can’t set the keybinding with the code. Maybe there should be a way to do it.

Should be possible using MainMenu?

Alternative answer to the original question: test with an example.

a = { }.fork;
a.clock
-> a TempoClock
a.clock === TempoClock.default
-> true
2 Likes