Pergunta

Como faço para passar uma função como argumento?

A ideia básica é algo assim (que não funciona):

∇R ← double a
R ← 2 × a
∇

∇R ← a applytwice f
R ← f f a
∇

5 applytwice double

Há algo como \fun Em Erlang ou Points de função em C?

Foi útil?

Solução

Na APL, as funções não podem ser aprovadas como argumentos para as funções. No entanto, o APL possui operadores, que são funções de ordem superior, que podem assumir funções como argumentos. Existem operadores primitivos como / (redução) usados, por exemplo, para resumir um vetor + / v. A função + é o operando esquerdo e é passado para o operador /.

No Dyalog APL, existe um operador primitivo usando o (chamado "Power") para aplicar uma função n vezes para que possamos escrever:

      double←{2×⍵}
      (double ⍣ 2) 7
28
      (double ⍣ 10) 7
7168

Você também pode escrever seus próprios operadores (na maioria dos APLs). Em Dyalog APL, podemos escrever seu operador Applytwice como:

     applytwice←{⍺⍺ ⍺⍺ ⍵}
     double applytwice 7
28

Por fim, você pode passar funções colocando -as em um espaço para nome e passando o espaço para nome. É como uma instância de classe muito leve com um método. Por exemplo:

       s←⎕NS ''
       s.f←{2×⍵}
       ApplyFTwice←{⍺.f ⍺.f ⍵}
       s ApplyFTwice 7
28

Nesse caso, a função deve ser nomeada F, mas poderíamos muitas funções diferentes denominadas F, cada uma em seu próprio espaço para nome.

Outras dicas

Seu aplicativo não estava tão longe de correto. Em Dyalog APL e possivelmente outros, o código não-DFN (definição da função legado) seria algo assim:

       ∇ R ← (f applytwice) a
  [1]   R ← f f a
       ∇

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

Na APL, qualquer "programa" que aceite zero, um ou dois argumentos de dados é uma "função". Funções internas como + - etc. podem ser chamadas de "funções primitivas". A dupla função nos exemplos seria uma "função definida". Um "operador" aceita funções e dados como argumentos. + / e + são exemplos do operador de redução e varredura, +é o argumento da esquerda da função para o operador / ou . Por outro lado, as funções de compactação e expansão usam os mesmos símbolos (/ e ), mas têm um argumento de dados esquerdo.

Tal é a nomenclatura da APL.

Você também pode contornar isso por citando. Você pode passar uma matriz de char e executá -la dentro da função. Essa string pode conter o nome de uma função definida ou uma definição direta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top