On 11/05/2022 20:20, Ihor Radchenko wrote:
Max Nikulin writes:
+ ;; In Emacs-27 and Emacs-28 `encode-time' does not support 6
elements
+ ;; list argument so `org-encode-time' can not be outside of
`pcase'.
+ (pcase-let
+ ((`(,_ ,_ ,_ ,d ,m ,y ,dow . ,_) (decode-time start)))
+ (pcase step
+ (`day (org-encode-time 0 0 org-extend-today-until (1+ d) m
y))
+ (`week
+ (let ((offset (if (= dow week-start) 7
+ (mod (- week-start dow) 7))))
+ (org-encode-time 0 0 org-extend-today-until (+ d offset)
m y)))
+ (`semimonth (org-encode-time 0 0 0
+ (if (< d 16) 16 1)
+ (if (< d 16) m (1+ m)) y))
+ (`month (org-encode-time 0 0 0 month-start (1+ m) y))
+ (`year (org-encode-time 0 0 org-extend-today-until 1 1 (1+
y))))))
I do not like repeating of `org-encode-time' but do not see another way
till Emacs-29 will become the lowest supported version.
This is fine. AFAIK, other parts of time handling code is full of conds
and pcases.
I mean that before my patch there was single `encode-time' outside of
`pcase', I replace `list' by `org-encode-time' inside each pattern.
+ (org-encode-time
+ (apply #'list
+ (or (car time0) 0)
+ (+ (if (eq timestamp? 'minute) n 0) (nth 1 time0))
+ (+ (if (eq timestamp? 'hour) n 0) (nth 2 time0))
+ (+ (if (eq timestamp? 'day) n 0) (nth 3 time0))
+ (+ (if (eq timestamp? 'month) n 0) (nth 4 time0))
+ (+ (if (eq timestamp? 'year) n 0) (nth 5 time0))
+ (nthcdr 6 time0))))
(when (and (memq timestamp? '(hour minute))
extra
(string-match "-\\([012][0-9]\\):\\([0-5][0-9]\\)" extra))
I am tempting to write something like
(let* ((ts (copy-sequence time0))
(ord (memq timestamp? '(year month day hour minute)))
(field (and ord (nthcdr (length ord) ts))))
(when field
(setcar field (+ (car field) n)))
(org-encode-time ts))
but I am afraid it will make the code rather obscure.
Yes, the second version is rather hard to understand. The proper
solution would be writing (or using) some high-level time handling
library and then using it in Org. Then, we would not need to deal with
low-level time representations so frequently.
From my point of view
(cl-mapcar
(lambda (value part)
(if (and part (eq part timestamp?))
(+ n value)
value))
time0 '(second minute hour day month year nil nil nil))
is better than the original code, but...
Nicolas Goaziou to emacs-orgmode. [Patch] to correctly sort the items
with emphasis marks in a list. Mon, 19 Apr 2021 18:08:17 +0200.
https://list.orgmode.org/87r1j6b6ku....@nicolasgoaziou.fr
>
I stay away from CL as much as possible, otherwise newcomers will have
to learn two languages to start contributing, Elisp and CL (cl-loop,
ewww). CL is still necessary however, as we cannot use `seq' yet.