The following is the smallest example of a lambda I could come up with (calling foo() and calling baz() will have the same result)
contract "lambdaTest" {
// this will be our lambda
define public @foo() {
entry:
ret 1234
}
// In a real world setting, this function would return a different lambda based on some condition
define public @bar(){
entry:
%this = call @iele.address()
%f = calladdress @foo at %this
ret %f
}
// fetch which lambda to use from bar and then call it
define public @baz() {
entry:
%f = call @bar()
%this = call @iele.address()
%gas = call @iele.gas()
%status, %result = call %f at %this () send 0, gaslimit %gas
ret %result
}
define @init() {
entry:
ret void
}
}
Unfortunately this is not very pretty because
Calladdress requires an "at" instead of implicitly using @iele.address()
- You cannot use
call on a register. You must use call at
I don't know why these restrictions exist.
Anyways this is a cool feature and it's much prettier than what you have to do in Solidity which involves mangling byte arrays 👍
The following is the smallest example of a lambda I could come up with (calling
foo()and callingbaz()will have the same result)Unfortunately this is not very pretty because
Calladdressrequires an "at" instead of implicitly using@iele.address()callon a register. You must usecall atI don't know why these restrictions exist.
Anyways this is a cool feature and it's much prettier than what you have to do in Solidity which involves mangling byte arrays 👍