I used to write let-like expressions -- with lexical scope.
So I write my own (sad, but it will fail with multiple threads):
# Useful thing for replacing
An idea:
class Object
def let(namespace, &block)
namespace_struct = Struct.new(*namespace.keys).new(*namespace.values)
namespace_struct.instance_eval(&block)
end
end
message = let(language: "Lisp", year: "1958", creator: "John McCarthy") do
"#{language} was created by #{creator} in #{year}"
end
Single-value scopping is more explicit because you name the variable(s) in the block arguments. This abstraction has been called as
, pipe
, into
, scope
, let
, peg
, ..., you name it, it's all the same:
class Object
def as
yield self
end
end
sum = ["1", "2"].map(&:to_i).as { |x, y| x + y } #=> 3
You can't specify the value that you want to initialize, but you can declare a variable as explicitly local to that block:
x = 'external value'
puts x
[1,2,3].each do |i; x|
x = i
puts x
end
puts x
This will result in:
external value
1
2
3
external value