O Zsh não tem nada como closures, pacotes ou namespaces. Zsh não tem um monte de coisas necessárias para ter fechamentos verdadeiros:
-
As funções não são de primeira classe. Você não pode passar funções como argumentos para outras funções, e as funções não podem retornar outras funções. (Você pode passar o nome de uma função para chamar, mas isso não é o mesmo que passar a função em si).
-
Você não pode ter funções aninhadas. Todas as funções no zsh são globais. Você deve prefixar seus nomes de função para evitar conflitos. Note especialmente que as funções irão sombrear programas externos com o mesmo nome. Se você tiver uma função chamada
ls
, ela será chamada em vez do programals
. Isso pode ser útil, exceto se você fizer isso por acidente. -
Variáveis são escopadas dinamicamente, não estaticamente escopo como na maioria das linguagens modernas. Mesmo se você pudesse ter funções aninhadas, as funções internas não se aproximariam das variáveis locais das funções externas da maneira que você normalmente esperaria. Você não poderia usá-los para criar módulos da maneira que as pessoas fazem, digamos, em Javascript.
-
Zsh faz ter funções anônimas, mas sem nenhuma dessas outras coisas elas não são muito úteis.
Então, basicamente, o melhor que você pode fazer é prefixar todas as suas funções e variáveis globais.
Também indicarei que você deve definir seu precmd
assim:
% autoload -Uz add-zsh-hook
% add-zsh-hook precmd my_precmd_function
add-zsh-hook
permite que você conecte sua função em precmd
sem sobrescrever quaisquer outras funções que também possam atrapalhar precmd
.
O que significa ter uma função carregada é uma questão separada. O Zsh possui um recurso de carregamento automático que carrega apenas funções do disco quando elas são realmente chamadas. Quando você faz autoload -Uz foobar
, isso faz com que a função chamada foobar
esteja disponível para chamar. Quando você realmente chama foobar
, isso carrega a definição do disco.