Лисп: decode-universal-time void - PullRequest
       4

Лисп: decode-universal-time void

1 голос
/ 17 ноября 2010

Я редактирую orgmode, режим управления временем для emacs. Я добавляю несколько новых функций времени. Кроме того, мне нужно определить день недели для данной даты. Я использую следующий код:

(defun org-day-of-week (day month year)
(nth-value 6 (decode-universal-time (encode-universal-time 0 0 0 day month year 0) 0)))

Выполнение этого кода дает мне ошибку:

nth-значение: определение функции символа недействительно: универсальное время декодирования

Я новичок в lisp и не могу найти информацию, связанную с этой ошибкой. Я предполагаю, что некоторые библиотеки не загружены или не доступны. Кто-нибудь может пролить свет на это?

С уважением, Эрвин Вролейк Snow.nl

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

По существу decode-universal-time - это функция Common Lisp.Они не обязательно доступны в emacs-lisp.Некоторая быстрая проверка в локальном emacs показывает, что это факт.

Что-то близкое к вашей первоначальной реализации:

(defun org-day-of-week (year month day)
   (nth 6 
        (decode-time 
           (date-to-time 
             (format "%d-%02d-%02dT00:00:00" year month day)))))

Вместо этого вы можете использовать decode-time (возможно,в сочетании с date-to-time):

время декодирования - это встроенная функция в `C исходном коде '.(время декодирования и необязательное указанное время) Декодируйте значение времени как (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE).Необязательный указанное время должно быть списком (HIGH LOW. IGNORED), начиная с `current-time 'и` file-attribute', или nil, чтобы использовать текущее время.Устаревшая форма (HIGH. LOW) также все еще принимается.Список состоит из следующих девяти членов: SEC - это целое число от 0 до 60;SEC равен 60 за секунду, что поддерживается только некоторыми операционными системами.МИНУТА - это целое число от 0 до 59. ЧАС - это целое число от 0 до 23. ДЕНЬ - это целое число от 1 до 31. МЕСЯЦ - это целое число от 1 до 12. ГОД - целое число, обозначающее год из четырех цифр.DOW - день недели, целое число от 0 до 6, где 0 - воскресенье.DST - t, если действует летнее время, в противном случае ноль.ZONE - это целое число, указывающее количество секунд к востоку от Гринвича.(Обратите внимание, что Common Lisp имеет разные значения для DOW и ZONE.)
2 голосов
/ 17 ноября 2010

Более чистая версия ответа Ватина :

(defun day-of-week (year month day)
  "Return the day of the week given a YEAR MONTH DAY"
  (nth 6 (decode-time (encode-time 0 0 0 day month year))))

decode-time и encode-time задокументированы здесь .

0 голосов
/ 17 ноября 2010

Я не нашел источник этой проблемы, но нашел обходной путь:

(defun day-of-week (day month year)
  "Returns the day of the week as an integer.
Sunday is 0. Works for years after 1752."
  (let ((offset '(0 3 2 5 0 3 5 1 4 6 2 4)))
    (when (< month 3)
      (decf year 1))
    (mod
     (truncate (+ year
                  (/ year 4)
                  (/ (- year)
                     100)
                  (/ year 400)
                  (nth (1- month) offset)
                  day
                  -1))
     7)))
...