Skip to content

Facilitate Creation of Function Pointers / Lambdas? #146

@SebastienGllmt

Description

@SebastienGllmt

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

  1. Calladdress requires an "at" instead of implicitly using @iele.address()
  2. 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 👍

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions