Mesmo que o ksh tenha recursos mais avançados do que outros shells, ainda é uma linguagem para automatizar tarefas simples e escrever pequenos scripts, não uma linguagem voltada para a criação de aplicativos enormes. Você não pode esperar ter todos os recursos de uma linguagem típica projetada para aplicativos grandes, muito menos todos os recursos do C ++.
Eu não acho que você pode criar um alias para um namespace. Você pode criar uma cópia de um namespace de classificações enumerando suas variáveis (analisar a saída de typeset +p
ou typeset -p
ou usar ${!.foo.*}
se desejar incluir variáveis herdadas do namespace pai) e copiá-las uma a uma . Você pode tornar uma variável um alias de outra com typeset -n
, mas isso só entra em vigor quando usado dentro do namespace:
$ namespace foo { x=1; }
$ namespace bar { typeset -n x=.foo.x; echo $x; }
1
$ namespace foo { x=2; }
$ namespace bar { echo $x; }
2
$ echo ${.bar.x}
.foo.x
O Ksh permite ir mais longe e executar código arbitrário quando uma variável é lida, modificada ou não definida, com funções de disciplina. Por exemplo, se você definir uma função chamada x.get
, essa função será invocada sempre que o valor de x
for recuperado.
namespace bar {
x.get () { _=${.foo.x}; }
x.set () { .foo.x=${.sh.value}; }
x.append () { .foo.x+=${.sh.value}; }
x.unset () { unset ${.sh.name}; }
}
Eu acho que você tem que defini-los para cada variável, e você não pode detectar variáveis que são adicionadas ao namespace foo
.
Isso pode ser estendido para procurar vários namespaces.
x.get () {
if ((${.foo.x+1}+${.bar.x+1}!=1)); then
echo 1>&2 "Ambiguous variable x, available in more than one of foo and bar"
exit 125
fi
_=${.foo.x-${.bar.x}}
}