Oops, that should be..

   | array lookupClosure performClosure |
   lookupClosure := [].
   lookupClosure := [:cls :selector |
        (cls == nil)
            ifTrue: [Warning signal: ('method lookup failure: ',
   selector)].
        cls methodDictionary
            at: selector
            ifPresent: [:meth | meth]
            ifAbsent: [lookupClosure value: cls superclass value:
   selector]].
   performClosure := [ :receiver :selector :args |
        (lookupClosure value: receiver class value: selector)
            valueWithReceiver: receiver arguments: args ].
   array := { 1 }.
   performClosure value: array value: #at:put: value: {1. 'Hello, world'}.
   array inspect.



On 10/16/2016 10:03 AM, Charlie Robbats wrote:

and a little block cleanup:

    | array lookupClosure performClosure |
    lookupClosure := [].
    lookupClosure := [:cls :selector |
        (cls == nil)
            ifTrue: [Warning signal: ('method lookup failure: ',
    selector)].
        cls methodDictionary
            at: selector
            ifPresent: [:meth | meth]
            ifAbsent: [lookupClosure value: cls superclass value:
    selector]].
    performClosure := [ :receiver :args |
        (lookupClosure value: array class value: #at:put:)
            valueWithReceiver: array arguments: args ].
    array := { 1 }.
    performClosure value: array value: {1. 'Hello, world'}.
    array inspect.


Charlie


On 10/16/2016 9:54 AM, Charlie Robbats wrote:
Here's a little change to get your #perform:withArguments: implemented.

| array lookupClosure method |
array := { 1 }.
lookupClosure := [].
lookupClosure := [:cls :selector |
    (cls == nil)
        ifTrue: [Warning signal: ('method lookup failure: ', selector)].
    cls methodDictionary
        at: selector
" ifPresent: [:meth | Smalltalk tools browser openOnMethod: meth]"
        ifPresent: [:meth | meth]
ifAbsent: [lookupClosure value: cls superclass value: selector]].
method := lookupClosure value: Array value: #at:put:.
method valueWithReceiver: array arguments: {1. 'Hello, world'}.
array


On 10/16/2016 9:32 AM, Ben Coman wrote:
On Sun, Oct 16, 2016 at 9:11 PM, Charlie Robbats
<charlie.robb...@gmail.com> wrote:
Here, Dmitry, try this code in playground...maybe helps you understand

| lookupClosure |
lookupClosure := [].
lookupClosure := [:cls :selector |
     (cls == nil)
ifTrue: [Warning signal: ('selector lookup failure: ', selector)].
     (cls methodDictionary
         at: selector
         ifAbsent: [nil])
ifNil: [lookupClosure value: cls superclass value: selector] ifNotNil: [:meth | Smalltalk tools browser openOnMethod: meth]].
lookupClosure value: Array value: #at:put:.
Nice example.  Slightly improved...

| lookupClosure |
lookupClosure := [].
lookupClosure := [:cls :selector |
     (cls == nil)
ifTrue: [Warning signal: ('selector lookup failure: ', selector)].
     cls methodDictionary
         at: selector
ifPresent: [:meth | Smalltalk tools browser openOnMethod: meth] ifAbsent: [lookupClosure value: cls superclass value: selector]].
lookupClosure value: Array value: #at:put:.

cheers -ben




Reply via email to