Last active
November 5, 2025 04:50
-
-
Save havenwood/8a144ac7fd1a1d47658702286f056230 to your computer and use it in GitHub Desktop.
An example showing how to convert a Proc into a lambda and vice versa with Fiddle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| require 'fiddle' | |
| module Procify | |
| WORD = Fiddle::SIZEOF_VOIDP | |
| RPROC_OFFSET = 4 * WORD | |
| PROC_FLAG_OFFSET = 32 | |
| PROC_PACKED = [0].pack('Q').freeze | |
| LAMBDA_PACKED = [2].pack('Q').freeze | |
| refine Proc do | |
| def procify | |
| return self unless lambda? | |
| lambda_flag PROC_PACKED | |
| end | |
| def lambdify | |
| return self if lambda? | |
| lambda_flag LAMBDA_PACKED | |
| end | |
| private | |
| def lambda_flag(packed_flag) | |
| addr = Fiddle.dlwrap(self).to_i | |
| rproc_ptr = Fiddle::Pointer | |
| .new(addr + RPROC_OFFSET, WORD) | |
| .to_str | |
| .unpack1('Q') | |
| flag_ptr = Fiddle::Pointer.new(rproc_ptr + PROC_FLAG_OFFSET, WORD) | |
| flag_ptr[0, WORD] = packed_flag | |
| self | |
| end | |
| end | |
| end | |
| using Procify | |
| ->{}.procify.lambda? | |
| #=> false |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment