Tenho uma função simples que é então definida como uma lista e invocada como uma lista:
f:{x*x}
q)(f; neg)[1; 2]
-2
q)(f; neg)[1; 3]
-3
q)(f; neg)[2; 3]
3
q)(f; neg)[4; 3]
3
para (f; neg)[1; 3] - ele retorna o mais à direita como neg (-3), mas então ele não retorna mais neg, pois o primeiro argumento se torna > 1, por exemplo: (f; neg)[2; 3] -> retorna 3
Esse comportamento é esperado. O que você está fazendo é indexar na lista de funções e então aplicar a função que foi retornada ao parâmetro que você passa como segundo parâmetro. Você pode ver isso aqui
Basicamente o que acontece é que o primeiro parâmetro de [1;3] é o índice para sua lista de funções e o segundo parâmetro 3 é o valor que você está aplicando. Agora, por que isso não funciona para os dois últimos exemplos?
Sempre que você indexa para uma lista com um índice que está fora do limite, ele retorna o elemento nulo correspondente do tipo de dados para essa lista.
O elemento nulo de uma lista de funções é a função identidade
(::)
que simplesmente retorna o parâmetro passado a ela como ele éEspero que isso ajude. Você pode ler mais sobre a função de identidade aqui https://code.kx.com/q/ref/identity/
E indexação aqui https://code.kx.com/q4m3/3_Lists/#34-indexing
O primeiro argumento está sendo usado para indexar na lista de funções, e o segundo argumento é aplicado ao resultado: