Domanda

E perché non lo cambiano?

Modifica: Il motivo è perché sono nuovo di emacs e vorrei utilizzare Emacs come "calcolatrice programmatore". Quindi, posso manipolare 32-bit & amp; Numeri interi a 64 bit e farli comportare come farebbero sulla macchina nativa.

È stato utile?

Soluzione

Emacs-Lisp è un linguaggio tipizzato in modo dinamico. Ciò significa che è necessario digitare i tag in fase di esecuzione. Se vuoi lavorare con i numeri, dovresti quindi normalmente impacchettarli in una sorta di contenitore taggato a cui puoi puntare (cioè & # 8220; box & # 8221; loro), poiché non c'è modo di distinguere un puntatore da un numero intero di macchina in fase di esecuzione senza una sorta di schema di tagging.

Per motivi di efficienza, la maggior parte delle implementazioni di Lisp non utilizza quindi puntatori non elaborati, ma ciò che penso sia chiamato descrittore. Questi descrittori sono in genere una singola parola macchina che può rappresentare un puntatore, un numero senza casella (un cosiddetto fixnum ) o una delle varie altre strutture di dati hardcoded (vale spesso la pena codificare NIL e contro anche celle speciali, ad esempio).

Ora, ovviamente, se aggiungi il tag di tipo, non hai a disposizione 32 bit completi per il numero, quindi rimani con 26 bit come nello schema MIT o 29 bit come in Emacs o qualsiasi altro numero di bit che non hai utilizzato per la codifica.

Alcune implementazioni di vari linguaggi dinamici riservano più tag per fixnum in modo che possano darti fixnum a 30-bit o addirittura a 31-bit. SBCL è un'implementazione di Common Lisp che fa questo . Tuttavia, non credo che la complicazione che ciò provoca sia valsa la pena per Emacs. Quante volte hai bisogno dell'aritmetica fixnum a 30 bit veloce rispetto all'aritmetica fixnum a 29 bit in un editor di testo che non compila nemmeno il suo codice Lisp in codice macchina (o no? ricordi, in realtà)? Stai scrivendo un client distribuito.net in Emacs-Lisp? Meglio passare a Common Lisp, quindi! ;)

Altri suggerimenti

I restanti 3 bit sono usati come flag dall'interprete Lisp. (Puoi ottenere numeri più grandi compilando Emacs per una macchina a 64 bit.)

Altri hanno commentato perché i fixnum sono larghi solo 29 bit. Ma se vuoi una calcolatrice da programmatore, dai un'occhiata a calc . Offre numeri interi di precisione arbitraria, operazioni a matrice, conversioni di unità, grafica tramite gnuplot, funzioni statistiche, funzioni finanziarie, funzioni scientifiche, notazione RPN e algebrica, semplificazione della formula ... ed è già parte di Emacs, quindi per iniziare, visita il Nodo informativo per " calc " e inizia dal tutorial.

Gli altri tre bit sono usati come tag del tipo di oggetto. Questo era così diffuso che un certo numero di architetture CPU includeva almeno un po 'di supporto per numeri interi con tag nei loro set di istruzioni: Sparc , Alpha , Burroughs e il K-Machine per esempio. Oggi permettiamo al runtime di Lisp di gestire i tag, senza supporto hardware aggiuntivo. Ti consiglio di leggere il primo link, su Sparc, se vuoi avere una rapida panoramica della storia.

In molte implementazioni di Lisp, alcuni dei bit di una parola sono usati per un tag. Ciò consente a cose come il Garbage Collector di sapere cos'è un puntatore e cosa non lo è senza dover indovinare.

Perché ti importa quanto è grande un fixnum Elisp? Puoi aprire file giganteschi come sono.

Uso l'interprete Common Lisp CLISP come calcolatrice per programmatori. Common Lisp ha la gestione dei numeri più sana che abbia mai visto in qualsiasi linguaggio di programmazione; in particolare, ha numeri interi di dimensione arbitraria, cioè bignum, nonché numeri razionali. Ha anche input in basi numeriche arbitrarie e funzioni bit a bit per bignum. Se vuoi calcolare da Emacs, puoi eseguire CLISP in una shell M-x. Come bonus, la sintassi è quasi identica a quella che useresti in Emacs Lisp.

Questo è vero solo per le architetture a 32 bit e può essere modificato in base alle opzioni di generazione. Gli altri bit vengono utilizzati per contrassegnare le strutture di dati di base.

Puoi usare una build a 64 bit con numeri interi più grandi e ci sono pacchetti per l'aritmetica di numeri interi arbitrariamente grandi.

O stai solo facendo una domanda retorica cercando di sembrare arrabbiato e importante ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top