Skip to content

Instantly share code, notes, and snippets.

@havenwood
Last active November 5, 2025 04:50
Show Gist options
  • Select an option

  • Save havenwood/8a144ac7fd1a1d47658702286f056230 to your computer and use it in GitHub Desktop.

Select an option

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
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