1

大きな数値、実際にはUNIXエポック時間から数えて秒単位の現在の時間を16進数の文字列に変換したいと思います。

私はずっと前にいくつかのコードをハッキングしましたが、それは(私が思うに)以前のバージョンのemacsで動作しましたが、現在使用しているemacs 23では動作しなくなりました(コードを台無しにした可能性があります)。

私が書いた当時の難しさは、特定の関数の1つの引数として扱うには数が多かったため、それを分割して何かを実行し、それらをまとめる必要がありました。たとえば、に大きな数を指定するとstring-to-number、整数が必要な場合でもfloatが返されます。

誰かがそれの書き直しを提案できますか?

以下は私が書いた壊れたコードです。それは機能しませんが、私が何をしようとしているのかをあなたに理解させるかもしれません。まず、これらはすべて以下で使用されるサブルーチンです。

(defun seconds-since-origin ()
    (string-to-number (concat
        (number-to-string (- (string-to-number
            (substring (format-time-string "%s") 0 5)
         ) 10000))
    (substring (format-time-string "%s") 5)
)))

(defun hexatridecimal (decimal)
(concat
    (let ((quotient (/ decimal 36)))    (if (> quotient 35)
        (hexatridecimal quotient)
        (hexatridecimal-digit quotient)
    ))
    (hexatridecimal-digit (% decimal 36))
))

(defun hexatridecimal-digit (number)
    (nth number (list
"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
    "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
)

呼び出される主な関数は次のとおりです。

(hexatridecimal (seconds-since-origin))
4

1 に答える 1

2

64 ビットの Emacs (使用しているのと同じように整数を処理できる) を使用して、次の変更を行います。

(defun seconds-since-origin ()
  (string-to-number (format-time-string "%s")))

(defun hexatridecimal (decimal)
  (let ((quotient (/ decimal 36))
        (remainder (% decimal 36)))
    (concat 
     (if (> quotient 0)
         (hexatridecimal quotient)
       "")
     (hexatridecimal-digit remainder))))

注: これは、32 ビット ビルドよりも大きな整数のビット数が多い 64 ビット Emacs を想定しています。

32 ビット Emacs で作業したい場合は、calcの big-int 機能を使用して計算を行い、コードを適切に調整できます。

追加するために編集:calcの bignum 機能 を使用するバージョンは次のとおりです。

(require 'calc)
(require 'calc-ext)
(defun seconds-since-origin ()
  (math-read-number-simple (format-time-string "%s")))
(defun hexatridecimal (decimal-bignum)
  (let* ((q-r (math-idivmod decimal-bignum 36))
     (quotient (car q-r))
     (remainder (cdr q-r)))
(concat 
 (if (math-lessp 0 quotient)
     (hexatridecimal quotient)
   "")
 (hexatridecimal-digit remainder))))
于 2011-03-21T22:53:28.393 に答える