A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-cmm.814.mcz ==================== Summary ==================== Name: Kernel-cmm.814 Author: cmm Time: 25 October 2013, 2:27:37.722 pm UUID: c757a2a8-26b1-422b-8b8b-4bf6640efbb4 Ancestors: Kernel-cmm.813 Added BlockClosure>>#valueWithAllPossibleArguments: to support passing a variable number of arguments to the image from the command-line. =============== Diff against Kernel-cmm.813 =============== Item was changed: + ----- Method: BlockClosure>>valueOtherwise: (in category 'evaluating') ----- - ----- Method: BlockClosure>>valueOtherwise: (in category 'events-support') ----- valueOtherwise: aBlock "Send the message and answer the return value" ^self value! Item was added: + ----- Method: BlockClosure>>valueWithAllPossibleArguments: (in category 'evaluating') ----- + valueWithAllPossibleArguments: anArray + "Same as valueWithPossibleArgs: except when the receiver takes just one-argument, and more than one argument is specified by anArray, then pass all of anArray as THE argument to the receiver block + This is used to allow a large, variable number of arguments to be passed." + ^numArgs = 0 + ifTrue: [self value] + ifFalse: + [self valueWithArguments: + (numArgs = anArray size + ifTrue: [anArray] + ifFalse: + [numArgs > anArray size + ifTrue: [anArray, (Array new: numArgs - anArray size)] + ifFalse: + [numArgs = 1 + ifTrue: [Array with: anArray] + ifFalse: [anArray copyFrom: 1 to: numArgs]]])]! Item was changed: + ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category 'evaluating') ----- - ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category 'events-support') ----- valueWithArguments: anArray otherwise: aBlock ^ self valueWithArguments: anArray! Item was changed: + ----- Method: BlockClosure>>valueWithEnoughArguments: (in category 'evaluating') ----- - ----- Method: BlockClosure>>valueWithEnoughArguments: (in category 'events-support') ----- valueWithEnoughArguments: anArray "call me with enough arguments from anArray" | args | (anArray size == self numArgs) ifTrue: [ ^self valueWithArguments: anArray ]. args := Array new: self numArgs. args replaceFrom: 1 to: (anArray size min: args size) with: anArray startingAt: 1. ^ self valueWithArguments: args! |
We already have two methods for this: #valueWithEnoughArguments: and
#valueWitPossibleArgs:. I think we should keep the first, and deprecate the second. Levente On Fri, 25 Oct 2013, [hidden email] wrote: > A new version of Kernel was added to project The Inbox: > http://source.squeak.org/inbox/Kernel-cmm.814.mcz > > ==================== Summary ==================== > > Name: Kernel-cmm.814 > Author: cmm > Time: 25 October 2013, 2:27:37.722 pm > UUID: c757a2a8-26b1-422b-8b8b-4bf6640efbb4 > Ancestors: Kernel-cmm.813 > > Added BlockClosure>>#valueWithAllPossibleArguments: to support passing a variable number of arguments to the image from the command-line. > > =============== Diff against Kernel-cmm.813 =============== > > Item was changed: > + ----- Method: BlockClosure>>valueOtherwise: (in category 'evaluating') ----- > - ----- Method: BlockClosure>>valueOtherwise: (in category 'events-support') ----- > valueOtherwise: aBlock > "Send the message and answer the return value" > > ^self value! > > Item was added: > + ----- Method: BlockClosure>>valueWithAllPossibleArguments: (in category 'evaluating') ----- > + valueWithAllPossibleArguments: anArray > + "Same as valueWithPossibleArgs: except when the receiver takes just one-argument, and more than one argument is specified by anArray, then pass all of anArray as THE argument to the receiver block > + This is used to allow a large, variable number of arguments to be passed." > + ^numArgs = 0 > + ifTrue: [self value] > + ifFalse: > + [self valueWithArguments: > + (numArgs = anArray size > + ifTrue: [anArray] > + ifFalse: > + [numArgs > anArray size > + ifTrue: [anArray, (Array new: numArgs - anArray size)] > + ifFalse: > + [numArgs = 1 > + ifTrue: [Array with: anArray] > + ifFalse: [anArray copyFrom: 1 to: numArgs]]])]! > > Item was changed: > + ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category 'evaluating') ----- > - ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category 'events-support') ----- > valueWithArguments: anArray otherwise: aBlock > > ^ self valueWithArguments: anArray! > > Item was changed: > + ----- Method: BlockClosure>>valueWithEnoughArguments: (in category 'evaluating') ----- > - ----- Method: BlockClosure>>valueWithEnoughArguments: (in category 'events-support') ----- > valueWithEnoughArguments: anArray > "call me with enough arguments from anArray" > | args | > (anArray size == self numArgs) > ifTrue: [ ^self valueWithArguments: anArray ]. > > args := Array new: self numArgs. > args replaceFrom: 1 > to: (anArray size min: args size) > with: anArray > startingAt: 1. > > ^ self valueWithArguments: args! > > > |
You might be right about #valueWithEnoughArguments: being the same as
#valueWithPossibleArgs. But, as you can see from the comment, valueWithAllPossibleArguments: was written with awareness of the existence of #valueWithPossibleArgs:, so I would not intentionally add a redundant method. What I need here is a single evaluation method which allows me to pass EITHER a fixed number of arguments, or an unknown, variable number of arguments. If the receiver Block takes 0 args, OR 2+ args, it operates exactly as valueWithPossibleArgs:. The receiver block takes 1 argument, and anArray specifies precisely one argument, it operates exactly as valueWithPossibleArgs:. If, however, he receiver block takes 1 argument, and anArray specifies _multiple_ arguments, then those arguments are passed into the block as an Array. On Fri, Oct 25, 2013 at 3:05 PM, Levente Uzonyi <[hidden email]> wrote: > We already have two methods for this: #valueWithEnoughArguments: and > #valueWitPossibleArgs:. I think we should keep the first, and deprecate the > second. > > > Levente > > > On Fri, 25 Oct 2013, [hidden email] wrote: > >> A new version of Kernel was added to project The Inbox: >> http://source.squeak.org/inbox/Kernel-cmm.814.mcz >> >> ==================== Summary ==================== >> >> Name: Kernel-cmm.814 >> Author: cmm >> Time: 25 October 2013, 2:27:37.722 pm >> UUID: c757a2a8-26b1-422b-8b8b-4bf6640efbb4 >> Ancestors: Kernel-cmm.813 >> >> Added BlockClosure>>#valueWithAllPossibleArguments: to support passing a >> variable number of arguments to the image from the command-line. >> >> =============== Diff against Kernel-cmm.813 =============== >> >> Item was changed: >> + ----- Method: BlockClosure>>valueOtherwise: (in category 'evaluating') >> ----- >> - ----- Method: BlockClosure>>valueOtherwise: (in category >> 'events-support') ----- >> valueOtherwise: aBlock >> "Send the message and answer the return value" >> >> ^self value! >> >> Item was added: >> + ----- Method: BlockClosure>>valueWithAllPossibleArguments: (in category >> 'evaluating') ----- >> + valueWithAllPossibleArguments: anArray >> + "Same as valueWithPossibleArgs: except when the receiver takes >> just one-argument, and more than one argument is specified by anArray, then >> pass all of anArray as THE argument to the receiver block >> + This is used to allow a large, variable number of arguments to be >> passed." >> + ^numArgs = 0 >> + ifTrue: [self value] >> + ifFalse: >> + [self valueWithArguments: >> + (numArgs = anArray size >> + ifTrue: [anArray] >> + ifFalse: >> + [numArgs > anArray size >> + ifTrue: [anArray, >> (Array new: numArgs - anArray size)] >> + ifFalse: >> + [numArgs = >> 1 >> + >> ifTrue: [Array with: anArray] >> + >> ifFalse: [anArray copyFrom: 1 to: numArgs]]])]! >> >> Item was changed: >> + ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >> 'evaluating') ----- >> - ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >> 'events-support') ----- >> valueWithArguments: anArray otherwise: aBlock >> >> ^ self valueWithArguments: anArray! >> >> Item was changed: >> + ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >> 'evaluating') ----- >> - ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >> 'events-support') ----- >> valueWithEnoughArguments: anArray >> "call me with enough arguments from anArray" >> | args | >> (anArray size == self numArgs) >> ifTrue: [ ^self valueWithArguments: anArray ]. >> >> args := Array new: self numArgs. >> args replaceFrom: 1 >> to: (anArray size min: args size) >> with: anArray >> startingAt: 1. >> >> ^ self valueWithArguments: args! >> >> >> > |
In reply to this post by Levente Uzonyi-2
I should have read it more carefully, because it's not the same. But I
don't see the point of this method. Can you give me a good use case? Levente On Fri, 25 Oct 2013, Levente Uzonyi wrote: > We already have two methods for this: #valueWithEnoughArguments: and > #valueWitPossibleArgs:. I think we should keep the first, and deprecate the > second. > > > Levente > > On Fri, 25 Oct 2013, [hidden email] wrote: > >> A new version of Kernel was added to project The Inbox: >> http://source.squeak.org/inbox/Kernel-cmm.814.mcz >> >> ==================== Summary ==================== >> >> Name: Kernel-cmm.814 >> Author: cmm >> Time: 25 October 2013, 2:27:37.722 pm >> UUID: c757a2a8-26b1-422b-8b8b-4bf6640efbb4 >> Ancestors: Kernel-cmm.813 >> >> Added BlockClosure>>#valueWithAllPossibleArguments: to support passing a >> variable number of arguments to the image from the command-line. >> >> =============== Diff against Kernel-cmm.813 =============== >> >> Item was changed: >> + ----- Method: BlockClosure>>valueOtherwise: (in category 'evaluating') >> ----- >> - ----- Method: BlockClosure>>valueOtherwise: (in category >> 'events-support') ----- >> valueOtherwise: aBlock >> "Send the message and answer the return value" >> >> ^self value! >> >> Item was added: >> + ----- Method: BlockClosure>>valueWithAllPossibleArguments: (in category >> 'evaluating') ----- >> + valueWithAllPossibleArguments: anArray >> + "Same as valueWithPossibleArgs: except when the receiver takes just >> one-argument, and more than one argument is specified by anArray, then pass >> all of anArray as THE argument to the receiver block >> + This is used to allow a large, variable number of arguments to be >> passed." >> + ^numArgs = 0 >> + ifTrue: [self value] >> + ifFalse: >> + [self valueWithArguments: >> + (numArgs = anArray size >> + ifTrue: [anArray] >> + ifFalse: >> + [numArgs > anArray size >> + ifTrue: [anArray, >> (Array new: numArgs - anArray size)] >> + ifFalse: >> + [numArgs = 1 >> + >> ifTrue: [Array with: anArray] >> + >> ifFalse: [anArray copyFrom: 1 to: numArgs]]])]! >> >> Item was changed: >> + ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >> 'evaluating') ----- >> - ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >> 'events-support') ----- >> valueWithArguments: anArray otherwise: aBlock >> >> ^ self valueWithArguments: anArray! >> >> Item was changed: >> + ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >> 'evaluating') ----- >> - ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >> 'events-support') ----- >> valueWithEnoughArguments: anArray >> "call me with enough arguments from anArray" >> | args | >> (anArray size == self numArgs) >> ifTrue: [ ^self valueWithArguments: anArray ]. >> >> args := Array new: self numArgs. >> args replaceFrom: 1 >> to: (anArray size min: args size) >> with: anArray >> startingAt: 1. >> >> ^ self valueWithArguments: args! >> >> >> > > |
In reply to this post by Chris Muller-3
On Fri, 25 Oct 2013, Chris Muller wrote:
> You might be right about #valueWithEnoughArguments: being the same as > #valueWithPossibleArgs. > > But, as you can see from the comment, valueWithAllPossibleArguments: > was written with awareness of the existence of > #valueWithPossibleArgs:, so I would not intentionally add a redundant > method. > > What I need here is a single evaluation method which allows me to pass > EITHER a fixed number of arguments, or an unknown, variable number of > arguments. > > If the receiver Block takes 0 args, OR 2+ args, it operates exactly as > valueWithPossibleArgs:. > > The receiver block takes 1 argument, and anArray specifies precisely > one argument, it operates exactly as valueWithPossibleArgs:. > > If, however, he receiver block takes 1 argument, and anArray specifies > _multiple_ arguments, then those arguments are passed into the block > as an Array. Why is this needed? Isn't it better to just wrap your argument array in another array, instead of introducing a new method with a rather unusal behavior? Levente > > On Fri, Oct 25, 2013 at 3:05 PM, Levente Uzonyi <[hidden email]> wrote: >> We already have two methods for this: #valueWithEnoughArguments: and >> #valueWitPossibleArgs:. I think we should keep the first, and deprecate the >> second. >> >> >> Levente >> >> >> On Fri, 25 Oct 2013, [hidden email] wrote: >> >>> A new version of Kernel was added to project The Inbox: >>> http://source.squeak.org/inbox/Kernel-cmm.814.mcz >>> >>> ==================== Summary ==================== >>> >>> Name: Kernel-cmm.814 >>> Author: cmm >>> Time: 25 October 2013, 2:27:37.722 pm >>> UUID: c757a2a8-26b1-422b-8b8b-4bf6640efbb4 >>> Ancestors: Kernel-cmm.813 >>> >>> Added BlockClosure>>#valueWithAllPossibleArguments: to support passing a >>> variable number of arguments to the image from the command-line. >>> >>> =============== Diff against Kernel-cmm.813 =============== >>> >>> Item was changed: >>> + ----- Method: BlockClosure>>valueOtherwise: (in category 'evaluating') >>> ----- >>> - ----- Method: BlockClosure>>valueOtherwise: (in category >>> 'events-support') ----- >>> valueOtherwise: aBlock >>> "Send the message and answer the return value" >>> >>> ^self value! >>> >>> Item was added: >>> + ----- Method: BlockClosure>>valueWithAllPossibleArguments: (in category >>> 'evaluating') ----- >>> + valueWithAllPossibleArguments: anArray >>> + "Same as valueWithPossibleArgs: except when the receiver takes >>> just one-argument, and more than one argument is specified by anArray, then >>> pass all of anArray as THE argument to the receiver block >>> + This is used to allow a large, variable number of arguments to be >>> passed." >>> + ^numArgs = 0 >>> + ifTrue: [self value] >>> + ifFalse: >>> + [self valueWithArguments: >>> + (numArgs = anArray size >>> + ifTrue: [anArray] >>> + ifFalse: >>> + [numArgs > anArray size >>> + ifTrue: [anArray, >>> (Array new: numArgs - anArray size)] >>> + ifFalse: >>> + [numArgs = >>> 1 >>> + >>> ifTrue: [Array with: anArray] >>> + >>> ifFalse: [anArray copyFrom: 1 to: numArgs]]])]! >>> >>> Item was changed: >>> + ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >>> 'evaluating') ----- >>> - ----- Method: BlockClosure>>valueWithArguments:otherwise: (in category >>> 'events-support') ----- >>> valueWithArguments: anArray otherwise: aBlock >>> >>> ^ self valueWithArguments: anArray! >>> >>> Item was changed: >>> + ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >>> 'evaluating') ----- >>> - ----- Method: BlockClosure>>valueWithEnoughArguments: (in category >>> 'events-support') ----- >>> valueWithEnoughArguments: anArray >>> "call me with enough arguments from anArray" >>> | args | >>> (anArray size == self numArgs) >>> ifTrue: [ ^self valueWithArguments: anArray ]. >>> >>> args := Array new: self numArgs. >>> args replaceFrom: 1 >>> to: (anArray size min: args size) >>> with: anArray >>> startingAt: 1. >>> >>> ^ self valueWithArguments: args! >>> >>> >>> >> > > |
Free forum by Nabble | Edit this page |