Ich meine den Zeitstempel für die letzte Änderung einer Funktion oder eines Operators, also die "Fix Time". Die Antwort ist doch ganz einfach und auch keine 500€ wert: 2 ⎕AT FOOname liefert als Ergebnis einen 7-stellingen ganzzahligen Vektor mit Datum und Uhrzeit des letzten "Fix".
Nein, das wäre zu einfach. Die Frage geht nach der Stelle, wo diese Angaben in der APL-Datei abgelegt sind, also der Datei, die den gespeicherten Workspace enthält.
Wer suchet, der wird was finden, so auch hier. Nun habe ich das gestern bereits das vierte Mal durchexerziert. Es ist also Zeit, das endlich niederzuschreiben. Hier die Erkenntnisse:
Der besagte Zeitstempel wird einige Bytes hinter der Funktion abgelegt. Und die ist nicht so leicht zu finden, denn eine Funktion bzw. ein Operator wird nicht als Zeichenkette - z.B. als ,⎕CR FOOname - gespeichert, sondern in einem internen Format aus Pointern und anderen Dingen. Hat man daher den Bereich gefunden, in der sich diese Darstellung der Funktion befindet, so muss man noch zusätzlich das Ende dieses Speicherbereiches bestimmen können. Das ist nicht immer offensichtlich.
Wie bereits geschrieben: wenige Bytes dahinter versteckt sich die "Fix time", glücklicherweise in nicht kryptischer Form in 7 Bytes abgelegt. Das Jahr in Byte 1, der Monat in Byte 2, Tag, Stunde, Minute, Sekunde und Millisekunde in den folgenden Bytes. Mit ⎕AF lassen sich die 7 Bytes als Zahlen zwischen 0 und 255 darstellen.
Nun ist das Leben nicht immer ganz so einfach. Wie kann ich das Jahr 2007 in 8 Bit ablegen? Als 27! Das ist die Differenz zu 1980. Das funktioniert also noch einige Jahre.
Leute in unseren Längengraden werden auch nicht die exakte Stunde des Fix-Zeitpunktes finden. Aber einen um zwei verringerten Wert. Das ist zur Zeit genau die Differenz zur Greenwich Mean Time (GMT), auch zu finden in der Systemvariablen ⎕TZ. "Zur Zeit" meint, dass dies im Winter anders ist, denn GMT kennt keine Sommerzeit.
Bleiben noch die Millisekunden: Auch die lassen sich nicht in einem Byte exakt unterbringen. Ich wusste mal, wie die mit 2 ⎕AT ausgeworfenen Millisekunden aus diesem Byte ermittelt werden. Aber zru Zeit streikt meine Erinnerung.
Wozu ist ist es gut, all dies zu wissen? Wenn ich damit das letzte Änderungsdatum einer Funktion manipulieren will, kann ich das auch einfacher erreichen - ohne mühsam irgendwelche Bytes in Dateien suchen zu müssen.
Also wozu bloß? Und was steht eigentlich in diesem Byte vor dem "Jahr"?