如何在 Daml 中调用具有动态名称的函数?

how to call function with dynamic name in Daml?

根据我们从列表传递的值,选择调用几乎没有需要调用的函数。

例如:

Choice Call: update X
let list = [FunctionX,FunctionZ,FunctionY]
list.forEach (FunctionName =>
  FunctionName  parameter 
)
function 1 :
X:FunctionX parameter  = X
function 2:
Z:FunctionZ parameter  = Z
function3 :
Y:FunctionY parameter  = Y

这里这个选择期望是调用函数X和函数Z 我们如何实现这个

最简单的解决方案可能是仅向选择添加一个参数并使其根据输入改变其行为。

我不完全确定你在这里寻找什么,但这可能会有所帮助:

module Main where

import Daml.Script
import qualified DA.Text

data Function = Reverse | Length | Dup
  deriving (Eq, Show)
data Result = ResultInt Int | ResultText Text
  deriving (Eq, Show)

execFn: Text -> Function -> Result
execFn arg = \case
  Reverse -> ResultText (DA.Text.reverse arg)
  Length -> ResultInt (DA.Text.length arg)
  Dup -> ResultText (arg <> arg)

template ChooseYourFunctions
  with
    owner: Party
    argument: Text
  where
    signatory owner
    controller owner can
      RunFunctions: [Result]
        with
          functions: [Function]
        do
          return $ map (execFn argument) functions
           

setup : Script ()
setup = script do
  alice <- allocatePartyWithHint "Alice" (PartyIdHint "Alice")

  exec <- submit alice do
    createCmd ChooseYourFunctions with
      owner = alice
      argument = "hello"
  
  result <- submit alice do
    exerciseCmd exec RunFunctions with functions = [Reverse, Length, Reverse, Reverse, Dup]

  debug result

  return ()

这将打印出以下跟踪(来自 debug 调用):

[ResultText "olleh",ResultInt 5,ResultText "olleh",ResultText "olleh",ResultText "hellohello"]

您可以在其中看到我们正在调用提供的函数列表。

如果您希望在每次调用的基础上更灵活地定义函数,您可能希望在 Daml 论坛上查看这些 two threads