Pergunta

E por que não mudá-lo?

Edit: A razão peço é porque eu sou novo no emacs e eu gostaria de usar Emacs como uma "calculadora programador". Então, eu posso manipular inteiros de 32 bits e de 64 bits e tê-los se comportam como se estivessem na máquina nativo.

Foi útil?

Solução

Emacs-Lisp é uma linguagem dinamicamente digitado. Isso significa que você precisa digitar as tags em tempo de execução. Se você queria trabalhar com números, você seria, portanto, normalmente tem que embalá-los em algum tipo de recipiente etiquetado que você pode apontar para ( “caixa”, ou seja eles), como não há nenhuma maneira de distinguir um ponteiro de um inteiro máquina em tempo de execução sem algum tipo de marcação esquema.

Por razões de eficiência, a maioria das implementações Lisp que, portanto, não usar ponteiros crus, mas o que eu acho que é chamado de descritores. Estes descritores são geralmente uma única palavra máquina que pode representar um ponteiro, um número unboxed (a chamada fixnum ), ou um dos vários outras estruturas de dados codificados (que é muitas vezes vale a codificação NIL e contras células especialmente, também, por exemplo).

Agora, obviamente, se você adicionar a tag tipo, você não tem o total de 32 bits deixados para o número, então você é deixado com 26 bits como no Esquema MIT ou 29 bits como em Emacs ou qualquer outro número de bits que você não usou-se para marcar.

Algumas implementações de várias linguagens dinâmicas reservar várias tags para Fixnums para que eles possam dar-lhe 30-bit ou mesmo Fixnums de 31 bits. SBCL é uma implementação de Common Lisp que faz isso . Eu não acho que a complicação que isso faz com que vale a pena para Emacs, no entanto. Quantas vezes você precisa rapidamente aritmética fixnum 30-bit em oposição a aritmética fixnum 29-bit em um editor de texto que nem sequer compilar seu código Lisp em código de máquina (ou ele? Eu não t lembre-se, na verdade)? Você está escrevendo um cliente distributed.net em Emacs-Lisp? Melhor mudar para Lisp comum, então! ;)

Outras dicas

Os restantes 3 bits são usados ??como bandeiras pelo interpretador Lisp. (Você pode obter números inteiros maiores compilando Emacs para uma máquina de 64 bits.)

Os outros têm comentado sobre o porquê Fixnums são apenas 29 bits de largura. Mas se você quiser calculadora de um programador, veja calc . Ele oferece inteiros de precisão arbitrária, as operações da matriz, conversões de unidade, gráficos via gnuplot, funções estatísticas, funções financeiras, funções científicas, RPN e notação algébrica, fórmula simplificação ... e já é parte do Emacs, por isso, para começar, visite o informações nó para "calc" e começar no tutorial.

Os outros três bits são utilizados como um marcador do tipo de objecto. Isto costumava ser tão prevalente que um número de arquiteturas de CPU incluídos pelo menos algum apoio para inteiros marcados em seus conjuntos de instruções: Sparc , Alpha , Burroughs , eo K-Machine por exemplo. Hoje em dia nós deixar o negócio de tempo de execução Lisp com etiquetas, sem suporte de hardware adicional. Eu recomendo a leitura do primeiro link, sobre Sparc, se você quiser ter uma visão geral da história.

Em muitas implementações Lisp, alguns dos bits em uma palavra são usadas para uma tag. Isso permite que coisas como o coletor de lixo sabe o que é um ponteiro eo que não é sem ter de adivinhar.

Por que você se importa quão grande uma fixnum Elisp é? Você pode abrir arquivos gigantescos como ela é.

Eu uso o CLISP interpretador Lisp Comum como calculadora de um programador. Lisp Comum tem a sanest manuseio número que eu já vi em qualquer linguagem de programação; mais notavelmente, ele tem inteiros de tamanho arbitrário, ou seja bignums, bem como números racionais. Ele também tem entrada em bases número arbitrário e funções bit a bit para bignums. Se você quiser calcular a partir do Emacs, você pode executar CLISP em um escudo M-x. Como um bônus, a sintaxe é quase exatamente o mesmo que o que você usaria em Emacs Lisp.

Isso só é verdade para 32 arquiteturas de bits, e pode ser alterado com base em opções de compilação. Os outros bits são usados ??para marcar as estruturas de dados básicas.

Você pode usar uma compilação de 64 bits que tem números inteiros maiores, e há pacotes para arbitrariamente grande aritmética inteira.

Ou, você está apenas fazendo uma pergunta retórica tentando soar irritado e importante ...

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