Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Classes / Object.schelp
blob6e25d99b9644f557fb43eebaafe9d7bb17d845bd
1 class:: Object
2 summary:: abstract superclass of all objects
3 categories:: Core>Kernel, Language>OOP
5 related:: Classes/Class, Guides/Intro-to-Objects, Reference/Classes
7 description::
8 Object is the root class of all other classes. All objects are indirect instances of class Object.
9 We call "receiver" the object the message is sent to: receiver.method(argument).
12 classmethods::
13 private:: prNewCopyArgs,prNew
14 method::readArchive
16 Read in an object from a text archive. pathname is a String containing the archive file's path.
17 discussion::
18 code::
19 a = Array.fill(100, { 100.0.rand });
20 a.writeArchive(PathName.tmp ++ "myArray");
21 b = Object.readArchive(PathName.tmp ++ "myArray");
22 a == b // true
24 /////////
26 // closed Function
28 f = { 1 + 2 };
29 f.writeArchive(PathName.tmp ++ "myFunc"); // succeeds
31 // open Function
33 var num;
34 num = 2;
35 f = { num + 2 };
36 f.writeArchive(PathName.tmp ++ "myFunc"); // fails
40 method::new
42 Create a new instance. The creation of new instances of any Object actually happens in this method (or with newCopyArgs ) when it is called by a child class. see link::Guides/WritingClasses::
44 method::newCopyArgs
46 Creates a new instance and copies the arguments to the instance variables in the order that the variables were defined.
48 code::
49 MyClass{
50         var a,b,c;
52         *new{ |arg1,arg2,arg3|
53                 ^super.newCopyArgs(arg1,arg2,arg3) //will copy arg1,arg2,arg3 to variables a,b,c
54         }
58 instancemethods::
59 private::addFunc, addFuncTo, removeFunc, removeFuncFrom
61 subsection::Class Membership
63 method::class
65 Answer the class of the receiver.
67 code::
68 5.class;
71 method::respondsTo
73 Answer a Boolean whether the receiver understands the message selector. selector must be a Symbol.
75 code::
76 5.respondsTo('+');
79 method::isKindOf
81 Answer a Boolean indicationg whether the receiver is a direct or indirect instance of aClass. Use of this message in code must be questioned, because it often indicates a missed opportunity to exploit object polymorphism.
83 code::
84 5.isKindOf(Magnitude);
87 method::isMemberOf
89 Answer a Boolean whether the receiver is a direct instance of aClass. Use of this message in code is almost always a design mistake.
91 code::
92 5.isMemberOf(Magnitude);
95 subsection::Accessing
97 method::size
99 Different classes interpret this message differently.  Object always returns 0.
102 subsection::Copying
104 method::copy
106 Make a copy of the receiver. The implementation of this message depends on the object's class.  In class Object, copy calls shallowCopy.
108 method::shallowCopy
110 Makes a copy of the object. The copy's named and indexed instance variables refer to the same objects as the receiver.
112 method::deepCopy
114 Recursively copies the object and all of the objects contained in the instance variables, and so on down the structure. This method works with cyclic graphs.
116 method::copyImmutable
118 If object is immutable then return a shallow copy, else return receiver.
120 subsection::Conversion
122 To convert an object of a certain Class into a similar, Object provides a number of methods.
124 method::as
126 Returns a similar new Object of a different class.
128 code::
129 [1, 2, 3].as(Set);
130 Pwhite(0.0, 1.0, 10).as(Set);
133 method::asArray
135 Returns an Array with the receiver, unless it is an Array already.
137 code::
138 [1, 2, 3].asArray;
139 5.asArray;
142 method::asCompileString
144 Returns a String that can be interpreted to reconstruct a copy of the receiver.
145 For the complementary method, see String interpret      .
147 code::
148 a = { 10.do { 10.postln } };
149 a.asCompileString.postcs;
150 a.postcs;
153 method::cs
155 shortcut for asCompileString
157 code::
158 { 10.do { 10.postln } }.cs;
161 subsection::Archiving
163 Object implements methods for writing and retrieving objects from disk. Note that you cannot archive instances of Thread and its subclasses (i.e. Routine), or open Functions (i.e. a Function which refers to variables from outside its own scope).
165 method::writeArchive
167 Write an object to disk as a text archive. pathname is a String containing the resulting file's path.
170 subsection::Equality and Identity
172 method::==
174 equality: Answer whether the receiver equals anotherObject. The definition of equality depends on the class of the receiver. The default implementation in Object is to answer if the two objects are identical (see below).
176 note:: Whenever == is overridden in a class, hash should be overridden as well.::
178 code::
179 5.0 == 5; // true
180 5.0 === 5; // false
181 a = [1, 2, 3]; b = [1, 2, 3];
182 a == b; // equal
183 a === b; // not identical
184 "worth trying" == "worth trying"; // equal
188 method::===
190 identity: Answer whether the receiver is the exact same object as anotherObject.
192 code::
193 5.0 === 5; // false
194 "worth trying" === "worth trying"; // not identical
195 'worth trying' === 'worth trying'; // identical (symbols are unique)
198 method::!=
200 non-equality: Answer whether the receiver does not equal anotherObject. The default implementation in Object is to answer if the two objects are not identical (see below).
202 method::fuzzyEqual
204 Retruns the degree of equality (in the range from 0 to 1) between two objects with regard to a given precision. Objects to compare must support max, substraction and division.
206 code::
207 5.0.fuzzyEqual(5.0, 0.5); // 1 - full equality
208 5.25.fuzzyEqual(5.0, 0.5); // 0.5 - 50 % equality
209 5.9.fuzzyEqual(5.0, 0.5); // 0 - no equality
212 method::compareObject
214 Tests if two Objects (of the same class) are the same in a certain respect: It returns true if instVarNames are equal in both. If none are given, all instance variables are tested (see also: instVarHash)
216 code::
217 a = Pseq([1, 2, 3], inf); b = Pseq([100, 200, 300], inf);
218 a.compareObject(b, [\repeats]); // true
219 a.compareObject(b, [\list]); // false
222 method::hash
224 Answer a code used to index into a hash table. This is used by Dictionary and Set and their subclasses to implement fast object lookup.  Objects which are equal == should have the same hash values. Whenever == is overridden in a class, hash should be overridden as well.
226 code::
227 a = "worth trying"; b = "worth trying";
228 a.hash;
229 b.hash;
232 method::identityHash
234 Answer a code used to index into a hash table. This method is implemented by a primitive and is not overridden. Objects which are identical === should have the same hash values.
236 code::
237 a = "worth trying"; b = "worth trying";
238 a.identityHash;
239 b.identityHash;
242 method::instVarHash
244 Returns a combined hash value for the object's instance variables and the object's class. If none are given, all instance variables are tested (see also: compareObject).
247 code::
248 a = Pseq([1, 2, 3], inf); b = Pseq([100, 200, 300], inf);
250 a.instVarHash([\repeats]); // same
251 b.instVarHash([\repeats]);
253 a.instVarHash([\list]); // different
254 b.instVarHash([\list]);
256 a = Pseq([1, 2, 3], inf); b = Prand([1, 2, 3], inf);
257 a.instVarHash([\list]); // different
258 b.instVarHash([\list]);
262 subsection::Testing
264 method::isNil
266 Answer a Boolean indicating whether the receiver is nil.
268 method::notNil
270 Answer a Boolean indicating whether the receiver is not nil.
272 method::isNumber
274 Answer a Boolean indicating whether the receiver is an instance of Number.
276 method::isInteger
278 Answer a Boolean indicating whether the receiver is an instance of Integer.
280 method::isFloat
282 Answer a Boolean indicating whether the receiver is an instance of Float.
284 method::?
286 If the receiver is nil then answer anObject, otherwise answer the receiver.
288 method::??
290 If the receiver is nil, evaluate the link::Classes/Function:: and return the result.
292 method::!?
294 If the receiver is not nil, evaluate the link::Classes/Function:: passing in the receiver as argument and return the result, otherwise return nil.
296 note::
297 The function will be inlined if it contains no variables or arguments.
300 discussion::
301 This method allow building up chains of actions to be performed on an object (possibly across several methods) without having to check if the object is nil or not. After all the desired actions are performed, link::#-??:: can be used to check if result the result is nil and supply a default value in that case.
303 Examples:
304 code::
305 x !? ( _ * 3 ) ?? { "It was a nil, so I give a default value".postln; Point(1,1) }
307 With code::x = nil::, this will result in:
308 teletype::
309 It was a nil, so I give a default value
310 Point( 1, 1 )
312 But if code::x = Point(3,4)::, the result will be:
313 teletype::
314 Point( 9, 12 )
317 Nested nil checks:
318 code::
320 x = nil;
321 y = Point(3,4);
322 z = Point(5,6);
323 x !? { |x| y !? { |y| z !? { |z|  x.rho * y.rho * z.rho } } }
326 Results in teletype::nil::
327 code::
329 x = Point(1,2);
330 y = Point(3,4);
331 z = Point(5,6);
332 x !? { |x| y !? { |y| z !? {  |z| x.rho * y.rho * z.rho } } }
335 Results in teletype::87.321245982865::
337 method::pointsTo
339 Returns true if receiver has a direct reference to obj.
341 code::
342 a = 9;
343 b = [1, a, 6, 8];
344 c = [1, b, 5];
345 c.pointsto(b); // true
346 c.pointsto(a); // false
349 method::mutable
351 Returns true if receiver is mutable.
353 code::
354 a = #[1, 2, 3]; b = [1, 2, 3];
355 a.mutable; // false
356 b.mutable; // true
359 method::frozen
361 Returns true if receiver is frozen.
363 method::switch
365 Object implements a switch method which allows for conditional evaluation with multiple cases. These are implemented as pairs of test objects (tested using if this == test.value) and corresponding functions to be evaluated if true. In order for switch to be inlined (and thus be as efficient as nested if statements) the matching values must be literal Integers, Floats, Chars, Symbols and the functions must have no variables or arguments.
367 discussion::
368 code::
370 var x, z;
371 z = [0, 1, 1.1, 1.3, 1.5, 2];
372 switch (z.choose.postln,
373         1,   { \no },
374         1.1, { \wrong },
375         1.3, { \wrong },
376         1.5, { \wrong },
377         2,   { \wrong },
378         0,   { \true }
379 ).postln;
385 code::
387 var x, z;
388 z = [0, 1, 1.1, 1.3, 1.5, 2];
389 x = switch (z.choose)
390         {1}   { \no }
391         {1.1} { \wrong }
392         {1.3} { \wrong }
393         {1.5} { \wrong }
394         {2}   { \wrong }
395         {0}   { \true };
396 x.postln;
400 subsection::Messaging
402 Instead of directly sending a method to an object, a method may be invoked given a method selector only (a Symbol). The other arguments may be provided by passing them directly, from an environment. If it si not known whether the receiver implements the metod, tryPerform only sends if it does, and superPerform invokes the method of the superclass.
405 method::perform
407 The selector argument must be a Symbol. Sends the method named by the selector with the given arguments to the receiver.
409 method::performList
411 The selector argument must be a Symbol. Sends the method named by the selector with the given arguments to the receiver. If the last argument is a List or an Array, then its elements are unpacked and passed as arguments.
413 code::
414 a = { |a, b, c| postf("% plus % plus % is %\n", a, b, c, a + b + c); "" };
415 a.performList(\value, [1, 2, 3]);
418 method::performMsg
420 The argument must be a List or Array whose first element is a Symbol representing a method selector. The remaining elements are unpacked and passed as arguments to the method named by the selector.
422 code::
423 a = { |a, b, c| postf("% plus % plus % is %\n", a, b, c, a + b + c); "" };
424 a.performMsg([\value, 1, 2, 3]);
427 method::performWithEnvir
429 argument:: selector
430 A Symbol representing a method selector.
431 argument:: envir
432 The remaining arguments derived from the environment and passed as arguments to the method named by the selector.
433 discussion::
434 code::
435 a = { |a, b, c| postf("% plus % plus % is %\n", a, b, c, a + b + c); "" };
436 a.performWithEnvir(\value, (a: 1, c: 3, d: 4, b: 2));
439 method::performKeyValuePairs
441 argument:: selector
442 A Symbol representing a method selector.
443 argument:: pairs
444 Array or List with key-value pairs.
445 discussion::
446 code::
447 a = { |a, b, c| postf("% plus % plus % is %\n", a, b, c, a + b + c); "" };
448 a.performKeyValuePairs(\value, [\a, 1, \b, 2, \c, 3, \d, 4]);
451 method::tryPerform
453 Like 'perform', but tryPerform passes the method to the receiver only if the receiver understands the method name. If the receiver doesn't implement that method, the result is nil. Note that this does not catch errors like 'try' does (see Exception). If the receiver does have a matching method but that method throws an error, execution will halt. But, 'tryPerform' is faster than 'try'.
455 code::
456 (a: 1, b: 2, c: 3).tryPerform(\keysValuesDo, { |key, value| [key, value].postln });
458 // Array does not understand keysValuesDo -- result is nil
459 [1, 2, 3].tryPerform(\keysValuesDo, { |key, value| [key, value].postln });
461 // Error occurs within keysValuesDo -- error is thrown back to halt execution
462 (a: 1, b: 2, c: 3).tryPerform(\keysValuesDo, { |key, value| [key, value].flippityblargh });
465 method::superPerform
467 Like perform, superPerform calls a method, however it calls the method on the superclass.
468 selector: A Symbol representing a method selector.
469 args: Method arguments.
472 method::superPerformList
474 Like performList, superPerformList calls a method, however it calls the method on the superclass.
475 selector: A Symbol representing a method selector.
476 args: Method arguments. If the last argument is a List or an Array, then its elements are unpacked and passed as arguments.
478 method::multiChannelPerform
479 Perform selector with multichannel-expansion.
480 argument:: selector
481 A Symbol representing a method selector.
482 argument:: ... args
483 Method arguments, which if they contain an array, will call the method multiple times for each sub-element.
484 discussion::
485 Example:
486 code::
487 a = { |a, b, c| format("% plus % times % is %", a, b, c, a + b * c).quote; };
488 a.multiChannelPerform(\value, [1, 10, 100, 1000], [2, 7, 9], [3, 7]);
490 ["foo","bar"].multiChannelPerform('++',["l","bro","t"]);
492 See also link::Guides/Multichannel-Expansion::
494 subsection::Unique Methods
496 Method definitions not yet implemented may be added to an Object instance.
498 method::addUniqueMethod
500 Add a unique method.
502 code::
503 a = 5;
504 a.addUniqueMethod(\sayHello, { |to| "hello " ++ to ++ ", I am 5" });
505 a.sayHello;
508 method::removeUniqueMethod
510 Remove a unique method.
512 code::
513 a.removeUniqueMethod(\sayHello);
514 a.sayHello;
517 method::removeUniqueMethods
519 Remove all unique methods of an Object.
521 subsection::Dependancy
523 method::addDependant
525 Add aDependant to the receiver's list of dependants.
527 method::removeDependant
529 Remove aDependant from the receiver's list of dependants.
531 method::dependants
533 Returns an IdentitySet of all dependants of the receiver.
535 method::changed
537 Notify the receiver's dependants that the receiver has changed. The object making the change should be passed as theChanger.
539 method::update
541 An object upon which the receiver depends has changed. theChanged is the object that changed and theChanger is the object that made the change.
543 method::release
545 Remove all dependants of the receiver. Any object that has had dependants added must be released in order for it or its dependants to get garbage collected.
547 subsection::Error Support
549 Object implements a number of methods which throw instances of Error. A number of methods (e.g. doesNotUnderstand) are 'private' and do not normally need to be called directly in user code. Others, such as those documented below can be useful for purposes such as object oriented design (e.g. to define an abstract interface which will be implemented in subclasses) and deprecation of methods. The reserved keyword thisMethod can be used to refer to the enclosing method. See also Method and Function (for exception handling).
551 method::throw
553 Throws the receiver as an Exception, which may or may not be caught and handled by any enclosing Function.
555 method::subclassResponsibility
557 Throws a SubclassResponsibilityError. Use this to indicate that this method should be defined in all subclasses of the receiver.
559 discussion::
560 code::
561 someMethod {
562         this.subclassResponsibility(thisMethod);
566 method::shouldNotImplement
568 Throws a ShouldNotImplementError. Use this to indicate that this inherited method should not be defined or used in the receiver.
570 method::deprecated
572 Throws a DeprecatedError. Use this to indicate that the enclosing method has been replaced by a better one (possibly in another class), and that it will likely be removed in the future. Unlike other errors, DeprecatedError only halts execution if Error.debug == true. In all cases it posts a warning indicating that the method is deprecated and what is the recommended alternative.
574 discussion::
575 code::
576 foo {
577         this.deprecated(thisMethod, ThisOrSomeOtherObject.findMethod(\foo);
578         … // execution of this method will continue unless Error.debug == true
582 subsection::Printing and Introspection
584 method::post
586 Print a string representation of the receiver to the post window.
587 "hello".post; "hello".post; "";
589 method::postln
591 Print a string representation of the receiver followed by a newline.
592 "hello".postln; "hello".postln; "";
594 method::postc
596 Print a string representation of the receiver preceded by comments.
597 "hello".postc; "hello".postc; "";
599 method::postcln
601 Print a string representation of the receiver preceded by comments, followed by a newline.
602 "hello".postcln; "hello".postcln; "";
604 method::postcs
606 Print the compile string representation of the receiver, followed by a newline.
607 "hello".postcs; "hello".postcs; "";
609 method::dump
611 Print a detailed low level representation of the receiver to the post window.
613 subsection::System Information
615 method::gcInfo
617 Posts garbage collector information in a table format.
619 discussion::
620 list::
621 ## flips: the number of times the GC "flipped", i.e. when it finished incremental scanning of all reachable objects
622 ## collects: the number of partial collections performed
623 ## nalloc: total number of allocations
624 ## alloc: total allocation in bytes
625 ## grey: the number of "grey" objects, i.e. objects that point to reachable objects and are not determined to be (un)reachable yet
628 Then for each size class: numer of black, white and free objects, total number of objects and the total set size.
630 code::
631 flips 241  collects 689096   nalloc 40173511   alloc 322496998   grey 346541
632         0  bwf t sz:    882      0 368573   369455    2955640
633         1  bwf t sz:   6197    122 5702377   5708696   91339136
634 2  bwf t sz:    947      4 1500009   1500960   48030720
635         3  bwf t sz:   8056  65201 301800   375057   24003648
636 4  bwf t sz:   4047    145   3457     7649     979072
637 5  bwf t sz:    422      1    431      854     218624
638 6  bwf t sz:    124      2     72      198     101376
639 7  bwf t sz: 153504      1      0   153505   157189120
640 8  bwf t sz:     22      0      0       22      45056
641 9  bwf t sz:      5      0      0        5      20480
642 10  bwf t sz:      5      0      0        5      40960
643 12  bwf t sz:      2      0      0        2      65536
644 13  bwf t sz:      1      0      0        1      65536
645 19  bwf t sz:      1      0      3        4   16777216
646 tot bwf t sz: 174215  65476 7876722   8116413   341832120
650 you can also query the amount of free memory with Object.totalFree and dump the currently grey objects with Object.dumpGrey. More memory status methods are: Object.largestFreeBlock, Object.gcDumpSet, and Object.gcSanity.
652 subsection::Iteration
654 method::do
656 Object evaluates the function with itself as an argument, returning the reasult. Different classes interpret this message differently.
657 discussion::
658 code::
659 f = { |x, i| [x, i].postln; };
660 [1, 2, 3].do(f); // Array.do
661 10.do(f); // Integer.do
662 ($Q).do(f); // Object.do
665 method::generate
667 Object iterates by the message do, sent to the receiver.
668 This method is used internally by list comprehensions.
670 method::dup
672 Duplicates the receiver n times, returning an array of n copies. Different classes interpret this message differently.  The shortcut "!" can be used in place.
673 discussion::
674 code::
675 8.dup(10);
676 8 ! 10; // same as above
677 x = [[1], [2], [3]].dup(5);
678 x[0] === x[1]; // false: copies receiver.
679 x[0][0] === x[1][0] // true: doesn't deepCopy receiver
680 { 1.0.rand }.dup(5) // other objects respond differently to dup
684 subsection::Routine Support
686 Objects support the basic interface of Stream, just returning itself in respone to the following messages:
687 next, reset, stop, free, clear, removedFromScheduler, asStream.
689 method::yield
691 Must be called from inside a Routine. Yields control to the calling thread. The receiver is the result passed to the calling thread's method. The result of yield will be the value passed to the Routine's next method the next time it is called.
693 method::yieldAndReset
695 Must be called from inside a Routine. Yields control to the calling thread. The receiver is the result passed to the calling thread's method. The Routine is reset so that the next time it is called, it will start from the beginning. yieldAndReset never returns within the Routine.
697 method::alwaysYield
699 Must be called from inside a Routine. Yields control to the calling thread. The receiver is the result passed to the calling thread's method. The Routine, when called subsequently will always yield the receiver until it is reset. alwaysYield never returns within the Routine.
701 method::embedInStream
703 Yields the receiver
705 method::idle
707 within a routine, return values (the receiver) until this time is over. (for an example, see Routine)
708 Time is measured relative to the thread's clock.
710 method::iter
712 Returns a OneShotStream with the receiver as return value.
714 method::cyc
716 Embeds the receiver in the stream n times (default: inf), each time resetting it.
718 method::fin
720 Calls next with the receiver n times only (default: 1), yielding the result.
722 method::repeat
724 Repeatedly embeds the receiver in the stream using a Pn (may thus be used for patterns and other objects alike)
726 method::loop
728 Indefinitely embeds the receiver in the stream
730 subsection::FunctionList
732 The messages addFunc, addFuncTo, removeFunc, removeFuncFrom are supported by Object. See link::Classes/Function::.