2010-11-17 17 views
1

Je suis en train d'éditer orgmode, un mode de gestion du temps pour emacs. J'ajoute quelques nouvelles fonctions de temps. Dans mon addition j'ai besoin de déterminer le jour de la semaine pour une date donnée. J'utilise le code suivant:Lisp: decode-universal-time est vide

(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))) 

exécution de ce code me donne l'erreur:

valeur nième: la définition de la fonction de Symbol est vide: decode-temps universel

Je suis nouveau à bégayer et ne trouve aucune information liée à cette erreur. Je suppose que certaines bibliothèques ne sont pas chargées ou disponibles. Quelqu'un peut-il faire la lumière sur ce sujet?

,

Cordialement Erwin Vrolijk Snow.nl

Répondre

3

essentiellement decode-universal-time est une fonction commune Lisp. Ils ne sont pas nécessairement disponibles dans emacs-lisp. Une vérification rapide dans un emacs local indique que c'est le fait.

Quelque chose proche de l'implémentation originale serait:

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

Vous devriez pouvoir utiliser decode-time à la place (peut-être conjointement avec date-to-time):

decode-time is a built-in function in `C source code'. (decode-time &optional specified-time) Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE). The optional specified-time should be a list of (HIGH LOW . IGNORED), as from `current-time' and `file-attributes', or nil to use the current time. The obsolete form (HIGH . LOW) is also still accepted. The list has the following nine members: SEC is an integer between 0 and 60; SEC is 60 for a leap second, which only some operating systems support. MINUTE is an integer between 0 and 59. HOUR is an integer between 0 and 23. DAY is an integer between 1 and 31. MONTH is an integer between 1 and 12. YEAR is an integer indicating the four-digit year. DOW is the day of week, an integer between 0 and 6, where 0 is Sunday. DST is t if daylight saving time is in effect, otherwise nil. ZONE is an integer indicating the number of seconds east of Greenwich. (Note that Common Lisp has different meanings for DOW and ZONE.)
0

je n'ai pas trouvé la source de ce problème, mais a trouvé une solution de contournement:

(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))) 
2

Une version plus propre answer de de Vatine est :

(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 et encode-time sont documented here.