# Passing a proc as block to a method from a C extension

**URL:** <https://www.ruby-forum.com/t/passing-a-proc-as-block-to-a-method-from-a-c-extension/70135>\
**Category:** Ruby\
**Created:** [February 18, 2006, 7:57pm UTC](https://www.ruby-forum.com/t/passing-a-proc-as-block-to-a-method-from-a-c-extension/70135 "2006-02-18T19:57:19Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dominik\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ac91a4/32.png) [@Dominik\_B](https://www.ruby-forum.com/u/Dominik_B)\
**Post date:** [February 18, 2006, 7:57pm UTC](https://www.ruby-forum.com/t/passing-a-proc-as-block-to-a-method-from-a-c-extension/70135/1 "2006-02-18T19:57:19Z")

</div>

Hi,

I am looking for a way to do the equivalent of the following ruby  
function  
in a C extension:

def foo(my\_proc)  
bar(&my\_proc)  
end

(and it should also work if bar is instance\_eval or module\_eval)

I couldn’t find a way to do this, the only idea I have is to do  
something  
like:

def foo(my\_proc)  
bar { |arg| my\_proc.call(arg) }  
end

This can be done using rb\_iterate, but it obviously doesn’t work with  
instance\_eval and module\_eval.

Any ideas?

Dominik

---

<div class="post-metadata">

**Author:** ![Dominik\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ac91a4/32.png) [@Dominik\_B](https://www.ruby-forum.com/u/Dominik_B)\
**Post date:** [February 20, 2006, 1:03am UTC](https://www.ruby-forum.com/t/passing-a-proc-as-block-to-a-method-from-a-c-extension/70135/2 "2006-02-20T01:03:56Z")

</div>

HI,

In message “Re: Passing a proc as block to a method from a C extension”  
on Sun, 19 Feb 2006 03:56:52 +0900, “Dominik B.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|I am looking for a way to do the equivalent of the following ruby function  
|in a C extension:  
|  
|def foo(my\_proc)  
| bar(&my\_proc)  
|end  
|  
|(and it should also work if bar is instance\_eval or module\_eval)

Currently there’s no good way, since no one has complained loudly  
before. Let me think about your request.

```
						matz.

```

---

<div class="post-metadata">

**Author:** ![Dominik\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ac91a4/32.png) [@Dominik\_B](https://www.ruby-forum.com/u/Dominik_B)\
**Post date:** [February 20, 2006, 1:49am UTC](https://www.ruby-forum.com/t/passing-a-proc-as-block-to-a-method-from-a-c-extension/70135/3 "2006-02-20T01:49:34Z")

</div>

On Mon, 20 Feb 2006 01:01:28 +0100, Yukihiro M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> |def foo(my\_proc)  
> | bar(&my\_proc)  
> |end  
> |  
> |(and it should also work if bar is instance\_eval or module\_eval)
> 
> Currently there’s no good way, since no one has complained loudly  
> before. Let me think about your request.

Ok, thanks. That’s what I thought.

I would like to have a function like

VALUE rb\_iterate\_proc(VALUE (\*it\_proc)(), VALUE data1, VALUE proc);

that would work like block\_pass().

Btw. could we also get a version of rb\_iter\_break that breaks with a  
value  
instead of just nil?

Dominik
