Issue #10095 has been updated by Matthew Kerwin.


Jihwan Song wrote:
> Matt,
> 
> I guess I had totally different understanding of the Ruby keyword 'yield'. When I first saw the language years back, at the statement saying 'yield' I was speaking to myself "yield what??" -- I always took it as meaning "produce" ( yeah, I always thought the 'yield' was a bad choice as the keyword for it in Ruby because it can be confused with other meanings of the word 'yield'... well, on the other hand, it may be the best word for it for the same reason :) )

How often do you see the keyword `yield` without arguments? Even in your examples you are clearly passing arguments (direct objects) to it.

> Once I understand the language, I always took it as transient verb with implied direct object, which is the block passed to it.

But you don't pass a block to the keyword; you're not saying "yield this block." Rather, you're instructing the scope (i.e. the function) to yield *values* (direct objects) *to the block* (indirect object).

Translating from Ruby to English:

~~~
def foo *a, &b
  yield *a
end
~~~

...becomes...

"foo, yield *a to &b"

So the subject is the function, the direct object is the args (which defaults to an empty list), and the indirect object is the block. If you explicitly name the subject, that subject has to "possess" the direct object, and then yield it to the indirect object (e.g. a function can resolve the variable `a` to an object and yield it; an array can resolve the index 0 to an object and yield it; etc.)

> Actually, the examples I included runs beautifully in current definition of Ruby language. The point of my sample code is to show you that it is totally coherent with current definition of Ruby language.

I still assert that it isn't coherent. Since the method receiver is the first (or only) of the direct objects, the message you are sending it should be "be yielded ...", not "yield".

> Now, with the extension of current work yield, without hurting the original meaning both in English and Ruby, it now can specify subject and direct object explicitly... that's all.

No, because `1.yield(2)` means: "1, yield the value 2 to ..." which is nonsensical. What you want to say is: "ruby, yield the values (1,2) to ..." or put another way "1, be yielded along with 2 to ..."

Best to leave the word "yield" out of the verb altogether.

----------------------------------------
Feature #10095: Object#as
https://bugs.ruby-lang.org/issues/10095#change-49011

* Author: Akira Matsuda
* Status: Open
* Priority: Normal
* Assignee: 
* Category: core
* Target version: current: 2.2.0
----------------------------------------
We've had so many times of feature requests for a method similar to Object#tap that doesn't return self but returns the given block's execution result (e.g. #7388, #6684, #6721 ).

I'm talking about something like this in Ruby of course:
Object.class_eval { def as() yield(self) end }

IIRC Matz is not against introducing this feature but he didn't like any of the names proposed in the past, such as embed, do, identity, ergo, reference, yield_self, itself, apply, map, tap!, etc.

So, let us propose a new name, Object#as today.
It's named from the aspect of the feature that it gives the receiver a new name "as" a block local variable.
For instance, the code reads so natural and intuitive like this:

(1 + 2 + 3 + 4).as {|x| x ** 2}
=> 100

Array.new.as {|a| a << 1; a << 2}
=> [1, 2]

---Files--------------------------------
itself-block.patch (1.35 KB)


-- 
https://bugs.ruby-lang.org/