From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nikita Karetnikov Subject: Re: New =?utf-8?Q?=E2=80=98--list-generations=E2=80=99?= and =?utf-8?Q?=E2=80=98--delete-generations=E2=80=99?= options Date: Wed, 11 Sep 2013 09:16:55 +0400 Message-ID: <87ob80os3c.fsf@karetnikov.org> References: <87vc2o4qwc.fsf@gnu.org> <87y57kljro.fsf@karetnikov.org> <87hae81uvo.fsf@gnu.org> <87bo4fcbcz.fsf@karetnikov.org> <878uzj6nev.fsf@gnu.org> <877gf1yftq.fsf@karetnikov.org> <87bo4dspl2.fsf@gnu.org> <87a9jxeh05.fsf@gnu.org> <87r4d9r2lv.fsf@gnu.org> <874na4jfp4.fsf_-_@karetnikov.org> <87eh97616m.fsf@gnu.org> <87bo48xdgb.fsf@karetnikov.org> <87hadz9gze.fsf@gnu.org> <87fvtjdl7y.fsf@karetnikov.org> <87bo444e9q.fsf@gnu.org> <87fvtfzihg.fsf@karetnikov.org> <87ioybxdun.fsf@gnu.org> <877geq9wx6.fsf@karetnikov.org> <87zjrmgcjh.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:43289) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VJcj7-0002oY-4b for guix-devel@gnu.org; Wed, 11 Sep 2013 01:12:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VJcj3-0007or-Ed for guix-devel@gnu.org; Wed, 11 Sep 2013 01:12:29 -0400 In-Reply-To: <87zjrmgcjh.fsf@gnu.org> ("Ludovic =?utf-8?Q?Court=C3=A8s=22'?= =?utf-8?Q?s?= message of "Mon, 09 Sep 2013 18:55:30 +0200") List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable >> How can I subtract 22 days from (current-time) using SRFI-19? > Note that the above example suggests that =E2=80=98string->duration=E2=80= =99 returns a > time object with of type =E2=80=98time-duration=E2=80=99 (thus independen= t of the > current time.) Ah, OK. But we=E2=80=99ll have to subtract from (current-time) later anywa= y, right? Why do you want to return a =E2=80=98time-duration=E2=80=99 object? So, here=E2=80=99s the parsing phase. WDYT? (use-modules (srfi srfi-1) (srfi srfi-19) (ice-9 regex)) ;;; ;;; Parsing. ;;; (define (string->generations str) (define (maybe-integer) (let ((x (string->number str))) (and (integer? x) (list x)))) (define (maybe-comma-separated-integers) (let ((lst (delete-duplicates (map string->number (delete "" (string-split str #\,)))))) (and (every integer? lst) lst))) (define (safe-match:substring->number match n) (false-if-exception (string->number (match:substring match n)))) (define (maybe-whole-range) (let* ((rx (make-regexp "^([0-9]+)\\.\\.([0-9]+)$")) (res (regexp-exec rx str)) (x (safe-match:substring->number res 1)) (y (safe-match:substring->number res 2))) (and (every integer? (list x y)) (<=3D x y) (iota (1+ (- y x)) x)))) (define (maybe-start-range) (let* ((rx (make-regexp "^([0-9]+)\\.\\.$")) (res (regexp-exec rx str)) (x (safe-match:substring->number res 1))) (and (integer? x) `(>=3D ,x)))) (define (maybe-end-range) (let* ((rx (make-regexp "^\\.\\.([0-9]+)$")) (res (regexp-exec rx str)) (x (safe-match:substring->number res 1))) (and (integer? x) `(<=3D ,x)))) (or (maybe-integer) (maybe-comma-separated-integers) (maybe-whole-range) (maybe-start-range) (maybe-end-range))) (define (string->duration str) (define (maybe-duration hours pattern) (let ((res (regexp-exec (make-regexp pattern) str))) (false-if-exception (make-time time-duration 0 (* 3600 hours (string->number (match:substring res 1)))))= )) (define (days) (maybe-duration 24 "^([0-9]+)d$")) (define (weeks) (maybe-duration (* 24 7) "^([0-9]+)w$")) (define (months) (maybe-duration (* 24 30) "^([0-9]+)m$")) (or (days) (weeks) (months))) --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAEBAgAGBQJSL/zKAAoJEM+IQzI9IQ38XNEP/2H/hSIFye5d0QkaYbZk+H3a lUxlhEwJ/9yIUAmNr1YH4Iq/NVVjqspHQvUCPmTtoim5RicxWSIRWVnNI2gjL5KZ qyBwIyQjz3J9GNT8NwyeMFyfETiqnrKQQMklEds/VVvBbm4/IhSP2XbixNrWAvoA 158dJz3x03ldMfdBmdI5HdgMPInoQHcqii+gm2HnYlzV8Xsilo+cd4c8MVB+l5KO Ilj8Ui2iNgk998c5DJuhtqoXwTVrws8ZITpNsM58D24G2aVWpTjPdbZfiMRmtF+9 7LbQwcueOSOAOAQO0HsMKg8j0R4NS2KqM71/TLG4PpVjf1Ogay7Td6rRL5SrtUGR 4NgT+FmhCKR+b26Z/bGUBsvfDDUkHJtqI9Avky4phs9jo9MNaudyqnqxdCHjBeVF ZPXy5OGqeaZ+ueYngbzGTyF9h6R6aRAGeo8zglLIrrlYxn6bUm42mEgaaHDFP3xT CK7JKHkwrl71O3D74qu1q80e8vZt2Gc+kS+xGlvu5qnN35vz4Y7nqPEjUcaxcjrz Vz+UqrtstbgfO9azzcFY+xFlnALKbdMX/78JwpPdqqbuO0TVf7EV+kqiTCs7W19o E0U6Unoy4gJUbYQuNy1IwSggQo+OIxpd8q9f4uQFwOraiRTc6UrVD1uF3wU+gLe1 /vVMtcn9NChgB1LUpVMt =06jr -----END PGP SIGNATURE----- --=-=-=--