Quando usar as propriedades do símbolo?

7

Digamos que eu precise associar símbolos a diretórios, e isso só precisará ser feito para um pequeno número de boundpsímbolos.

Na minha opinião, existem duas maneiras fáceis de fazer isso:

  1. Armazene essa associação em uma variável separada (alist ou um mapa de hash). Dessa forma, o diretório de cada símbolo estaria acessível com (cdr (assq SYMBOL my-alist)).
  2. Armazene isso em uma propriedade de símbolo. Dessa forma, seria acessível com (get SYMBOL 'my-directory).

Qual dessas seria a maneira idiomática de acompanhar essas informações?

Malabarba
fonte
Vale a pena indicar se você sabe com certeza que não há caso de uso para quem deseja vincular dinamicamente os valores em um escopo temporário (pois isso excluiria a opção 2).
Phs #
@phils bom ponto. Por design, não é para ser deixado vinculado, mas acho que é uma preocupação válida. Você nunca sabe quais casos de uso outras pessoas podem encontrar para suas funções.
Malabarba
@ phils: Como assim? Apenas os adereços dos símbolos, e não os valores dos símbolos, estão em questão aqui, não? (defvar s 5) (put 's 'd "c:/abc/") (let ((s 4)) (message "d: %s, val: %S" (get 's 'd) s)). E OP: por que você fala de "funções", não de símbolos? Eu devo estar esquecendo alguma coisa.
Drew
@Drew ele quis dizer deixar vincular o diretório associado a um símbolo. Não é possível se você usar propriedades de símbolos, mas é possível se você armazenar essas informações em uma variável como uma lista alista (você apenas permite vincular a lista alista). Quanto à sua segunda pergunta, eu disse "funções" porque todo esse comportamento será envolvido por funções, é claro. Acho que nunca vi um pacote sem funções. :-)
Malabarba
Se vocês se entendem, não há necessidade de explicar, mas FWIW ainda não entendo. Ao "vincular um dir", presumo que você queira dizer vincular uma variável a uma sequência de diretórios. Certamente é possível que o valor de uma propriedade de símbolo seja um símbolo, cujo valor de símbolo contenha a sequência dir. let- vincular esse símbolo de seqüência de caracteres dir (que é usado como valor prop) não deve ser um problema. (Sinta-se livre para ignorar se não for pertinente.)
de Drew

Respostas:

7

Realmente depende dos casos de uso.

De um modo geral, as propriedades dos símbolos são recursos "de baixo nível" / "internos" e não se deve usá-los para itens de "nível de usuário". No entanto, há um lugar para tudo :-)

Alguns pontos que você pode querer considerar são:

  1. Velocidade: as propriedades dos símbolos são as mais rápidas, seguidas de perto pelas tabelas de hash; as listas são lentas .
  2. É mais fácil redefinir seu sistema (por exemplo, remover todos os vestígios do seu pacote) com uma tabela alist / hash (redefina a variável para nil) do que com as propriedades do símbolo (itere sobre obarraye elimine todas as propriedades relevantes de todos os símbolos).
  3. É fácil sombrear dinamicamente a configuração usando alist; muito mais difícil com tabelas de hash e propriedades de símbolo.

Outra opção que você pode querer considerar é .dir-locals.el.

sds
fonte
Boa resposta. Não sei sobre # 2, no entanto. O que você quer dizer com "redefinir seu sistema"? Você está falando sobre a dificuldade relativa de remover uma propriedade de um símbolo (vs, por exemplo, uma chave de um alist)?
Drew
@ Drew: Esclarei meu ponto. É melhor agora?
Sds
Sim, completamente claro agora. Gostaria de saber se você talvez não quis dizer isso.
Drew
0

Desde que você use o nome canônico para o diretório, uma hashtable ou uma lista alista está funcionando. Se você espera que o usuário modifique ou inspecione os dados, use uma lista. Caso contrário, uma hashtable funciona melhor e será muito melhor.

Ted Zlatanov
fonte