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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions