2014-01-28 9 views
10

TL; DR: Kann 32bit Emacs-Lisp-Byte über die ersten 512 MB einer Datei?Zugriff auf Bytes jenseits der meisten positiven-Fixnum in Emacs lisp

Ich benutze Emacs-Lisp für verschiedene Datenverarbeitungsaufgaben wegen seiner (offensichtlich) hohen Integrationsebene mit dem Editor.

Beim Schreiben von benutzerdefinierten Funktionen stößt ich manchmal in die Grenzen von most-positive-fixnum. Während ich mit den Gründen leben und verstehen kann, warum ich nicht in der Lage bin, eine ganze 1-GB-Datei in einen Puffer zu laden, erlaubt die insert-file-contents[-literally] Schnittstelle auch keinen Zugriff auf Datenblöcke jenseits der ersten 512 MB einer Datei, da sie als Argument ein benötigt ganzzahliger Bytebereich

Gibt es eine Möglichkeit, diese Einschränkung zu umgehen? Soweit ich weiß, insert-file-contents ist derzeit die niedrigste Datei-Lesefunktion für Emacs-Lisp, insert-file-contents-literally ist nur eine Variante der ersten konfiguriert durch die Einstellung ein paar Variablen, dh emacs-lisp scheint keine Low bereitzustellen -level fopen Typ Dateischnittstelle.

Seltsamerweise an einem Punkt (möglicherweise mit einer selbst kompilierten Binärdatei) Aufruf insert-file-contents-literally mit Gleitkomma-Argumente für mich gearbeitet, den Zugriff auf hohe Byte-Bereiche zu Lasten der Gefahr von Rundungsfehlern. Bei Verwendung der neuesten vorkompilierten Emacs-Version von ftp.gnu.org (24.3 zum Schreiben) führt dies jedoch zu einem (wrong-type-argument file-offset NUMBER) Fehler.

+0

Scheint, dass Sie externe Befehle wie 'head' und' tail' verwenden müssen, siehe http://www.emacswiki.org/emacs/VLF. In diesem Fall könntest du mit 'emacs-calc' willkürlichen Präzisionszahlen herumspielen. – Tobias

+1

Die Verwendung externer Befehle führt leider zu einer Plattformabhängigkeit, die ich vermeiden möchte; Ich verwende hauptsächlich Emacs unter Windows. – kdb

Antwort

1

Es gibt keine Möglichkeit, dies nur in Emacs zu tun. Sie müssen irgendein externes Programm in irgendeiner Weise verwenden. Es ist eine bekannte Einschränkung, ich glaube, dass es bereits im Bugtracker ist.