>>694
callcc を使えばできなくはない。

$hash = {}
def open(fn)
  fh = nil
  if ctn = callcc { |c| c }
    open_block(fn) do |fh|
      $hash[fh] = []
      ctn.call(nil) if $hash[fh][0] = callcc { |c| c }
    end
    ctn = $hash[fh][1]
    $hash.delete(fh)
    ctn.call(nil)
  end
  fh
end

def close(fh)
  $hash[fh].call(nil)
end

これを一般化したものが添付ライブラリの generator 。