From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: JD Smith Newsgroups: gmane.emacs.bugs Subject: bug#71572: [PATCH] seconds-to-string-approximate Date: Mon, 9 Dec 2024 04:52:56 +0900 Message-ID: References: <86r0cpicwt.fsf@gnu.org> <86msmxafog.fsf@gnu.org> <3530cd89-b5a2-4b25-95bf-1896c8ee4aef@cs.ucla.edu> <8CC4B1BB-B56A-4C3E-8B51-0E2D5B65C296@gmail.com> <86jzcbir3c.fsf@gnu.org> <874j3f2tga.fsf@pub.pink> Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.600.62\)) Content-Type: multipart/alternative; boundary="Apple-Mail=_DDBA6E5C-506F-4C03-B7B9-3E33D5165806" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20362"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Adam Porter , 71572@debbugs.gnu.org, Eli Zaretskii , Jonas Bernoulli , Paul Eggert To: john muhl Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Dec 08 20:55:16 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1tKNN5-00058t-PB for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 08 Dec 2024 20:55:16 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tKNMw-00061z-2w; Sun, 08 Dec 2024 14:55:06 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tKNMu-00061r-10 for bug-gnu-emacs@gnu.org; Sun, 08 Dec 2024 14:55:04 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tKNMt-00053F-Ny for bug-gnu-emacs@gnu.org; Sun, 08 Dec 2024 14:55:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=References:In-Reply-To:Date:Mime-Version:From:To:Subject; bh=T2CEOk19JDdzf/XjFy+hmeU0pcB8IWwJ/gSoBKJRrXg=; b=BZCXyjFeniPm5grM2RohcBmDXSq38uDj7TjWSDA0/F5xZq8K9+qzXkwth7e7nQob2LIvIAew7ZFHwMunrb9L3y/N0HQ+oBHfxd22o8HKbRO1kgNqj618WHddm+P9PMkKfE5j2TKhN+TnULpXMw4sJRUIf37dIODtVC6y4RVUNYNPW2pBXofo1i8YmIXXUUAbZsub5c0SGNob80SrXu9YFNn4xCtaqP826klqGxpF33WcGWaHGaYoRxm/bb/AATrhEdG/aAiya2gFqK9bUPNp01xOaGkvvMAVbGUWTCM2V4pP9YFBWCyhfYN1YjRI3B9il21UAgSjp/a8NTxNoJOX0Q==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tKNMs-0003aT-Ie for bug-gnu-emacs@gnu.org; Sun, 08 Dec 2024 14:55:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: JD Smith Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 08 Dec 2024 19:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 71572 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 71572-submit@debbugs.gnu.org id=B71572.173368766013703 (code B ref 71572); Sun, 08 Dec 2024 19:55:02 +0000 Original-Received: (at 71572) by debbugs.gnu.org; 8 Dec 2024 19:54:20 +0000 Original-Received: from localhost ([127.0.0.1]:51754 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tKNMC-0003Yx-9F for submit@debbugs.gnu.org; Sun, 08 Dec 2024 14:54:20 -0500 Original-Received: from mail-pg1-f170.google.com ([209.85.215.170]:53282) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tKNM8-0003Ya-Si for 71572@debbugs.gnu.org; Sun, 08 Dec 2024 14:54:18 -0500 Original-Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-7fd21e4aa2eso1684310a12.2 for <71572@debbugs.gnu.org>; Sun, 08 Dec 2024 11:54:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733687591; x=1734292391; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=T2CEOk19JDdzf/XjFy+hmeU0pcB8IWwJ/gSoBKJRrXg=; b=Tu1jMrkRDu566zwCKKMg9kAQO5WmuAPxG5QISsF73Fne0HjtSpcWDLXkgmZIIls/kL SQ92fmls1CVonyVnYr5ZyHZu5QZst0G0TPBO9V7Tb8Iy09riTVzVCVFhLmyiWkXwSg08 UjIoAAdmhf6GOlkJw9apBbitV4PePduHQ5uZbuLt8nd+ZHP/f2/iBlR7D5QzdyzWIPxu iqFvzFNgG4jZRRkBdM5Lj7bwKHvrG+Q2XYlTjLES2xS/hHLqNFD7c23Zfd1BQO4x4xr4 NbFZqTYmOYtVd+0Ts6P5niBrhfpwo04vNAs79EuZCt3EN9yvGfh2Y+TBfSEKW7DcZPwu mnzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733687591; x=1734292391; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=T2CEOk19JDdzf/XjFy+hmeU0pcB8IWwJ/gSoBKJRrXg=; b=vvUvtJ1Mr54YJvcaPFMdRHqf975Pt0EkWknrr88WCQyOlhkqdALHDGse7JcXFcqiyW M17yprmgIHJSGoYiBXfP5ZF4Rkv2cNhchWsEgJAyZ4R55UypY6uSBvmkJriGX1sB6242 UZsqlp2FxvPSEyrajqIy/eIY5tEjzfhvWBC18CNB+wW5am5NSvS2OmN6vMcLnGFlWcB8 5ISE7XaKlzdm8QrfaBX2QliYl8OYRUdxyCK3oJUIJftbBYavoibEZ9xMr4d24GncKRyR WzBsVKBuV63TGUXjftEO2S8kY9u5qu+hXLqEuzOk9aqZdRWR1GQAsUPySgm/pGT0z448 qV1Q== X-Forwarded-Encrypted: i=1; AJvYcCXVM6R7SvQ21ovr7KjnXMtvyo+JV1AdxdElhpJCTqFdSUd6u0QfIxEUNFWUqSjRQ82Y+EgrAw==@debbugs.gnu.org X-Gm-Message-State: AOJu0YyeckQ+/qjyEVqLvrS98cxOLvquDPDsz5f0raGUNFjA45kWrUf0 GjcUhlpJyu3rSjzM9Rtq+6Ev0oxNPMahFBtDfwUlG8xN/mXm+Q2l X-Gm-Gg: ASbGncsm0ThtBl/+aHn/+vYQLnGOzVTRSMGi/kJ0WJu2buAkCY/pdEIGIGmGd+vIe8Y 3HCI6k5o5qeKXE+V/Oy051GmKFiflJ3YndDM2CoZEcZSlt19cHSgyeoe81ThJaZ657BAi2HHQnH /0KqFieSg8OL85KBnsmjJZCG0qGJjmeDj71UYe3s7kUKXSG4OiEvEhg0gBe4NgdBxTmv4eIs5aj GpQVxCe+6lMd7M3bZZMwHayV/AnTct+FrncwEfhvsitbuZ3TRF0VALWJX0c/FVuU+I1s864Ciqa dLKOn3UG543KpFSTxjWWdtw= X-Google-Smtp-Source: AGHT+IEpg6UlAEIoLElFoBmnqsioRnnB8sNaIlFFyPw4g2uLPFcjOYIUC6Khz+PLbWHG7PY1gjeQsQ== X-Received: by 2002:a17:90b:3810:b0:2ea:356f:51b4 with SMTP id 98e67ed59e1d1-2ef69e16dc9mr15996623a91.13.1733687590654; Sun, 08 Dec 2024 11:53:10 -0800 (PST) Original-Received: from smtpclient.apple (fs96f9cd8a.tkyc508.ap.nuro.jp. [150.249.205.138]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ef6d1fd68asm5244323a91.36.2024.12.08.11.53.07 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 08 Dec 2024 11:53:09 -0800 (PST) In-Reply-To: <874j3f2tga.fsf@pub.pink> X-Mailer: Apple Mail (2.3774.600.62) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:296662 Archived-At: --Apple-Mail=_DDBA6E5C-506F-4C03-B7B9-3E33D5165806 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Dec 8, 2024, at 4:17=E2=80=AFAM, john muhl wrote: >=20 > JD Smith > writes: >=20 >>> On Dec 7, 2024, at 8:02=E2=80=AFAM, Eli Zaretskii = wrote: >>>=20 >>>> From: JD Smith >>>> Date: Sat, 30 Nov 2024 13:58:52 -0500 >>>> Cc: Eli Zaretskii , >>>> Adam Porter , >>>> jonas@bernoul.li, >>>> Paul Eggert >>>>=20 >>>> I was recently reminded of the need for a more capable = seconds-to-string. =20 >>>>=20 >>>> Anyone have any additional comments on this proposed patch? If not, >>>> I'd suggest someone with access >>>> merges. >>>=20 >>> A few minor nits below, and then we can install: >>=20 >> Thanks. Updated patch below. >=20 > Thanks for working on this. I gave a quick try and noticed some > amounts aren=E2=80=99t pluralized how I expect; e.g. >=20 > (seconds-to-string 36541462 'expanded nil 1) > ;; "1 year 1.9 month" ... > According to the Chicago Manual of Style all fractional values are > plural, even 1.0, 2.0 &c. Thanks for this, a case I hadn't tested. Corrected in the attached. =EF=BF=BC --Apple-Mail=_DDBA6E5C-506F-4C03-B7B9-3E33D5165806 Content-Type: multipart/mixed; boundary="Apple-Mail=_511C128D-6BDC-4E62-99FA-55E18D861F0B" --Apple-Mail=_511C128D-6BDC-4E62-99FA-55E18D861F0B Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8
On Dec 8, = 2024, at 4:17=E2=80=AFAM, john muhl <jm@pub.pink> wrote:

JD Smith <jdtsmith@gmail.com> = writes:

On Dec 7, 2024, at = 8:02=E2=80=AFAM, Eli Zaretskii <eliz@gnu.org> = wrote:

From: JD Smith = <jdtsmith@gmail.com>
Date: Sat, 30 Nov 2024 13:58:52 = -0500
Cc: Eli Zaretskii <eliz@gnu.org>,
Adam Porter = <adam@alphapapa.net>,
jonas@bernoul.li,
Paul Eggert = <eggert@cs.ucla.edu>

I was recently reminded of the need = for a more capable seconds-to-string.  

Anyone have any = additional comments on this proposed patch? If not,
I'd suggest = someone with access
merges.

A few minor nits = below, and then we can install:

Thanks. =  Updated patch below.

Thanks = for working on this. I gave a quick try and noticed some
amounts aren=E2=80=99t pluralized how I = expect; e.g.

 (seconds-to-string = 36541462 'expanded nil 1)
 ;; "1 year 1.9 = month"
...
According to the Chicago Manual of Style all = fractional values are
plural, even 1.0, 2.0 = &c.

Thanks for this, a case I = hadn't tested.  Corrected in the = attached.

= --Apple-Mail=_511C128D-6BDC-4E62-99FA-55E18D861F0B Content-Disposition: attachment; filename=0001-seconds-to-string-new-optional-arguments-for-readabl.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-seconds-to-string-new-optional-arguments-for-readabl.patch" Content-Transfer-Encoding: quoted-printable =46rom=20c1937c9969955cd040a6587cba9e4d91e79ec78c=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20JD=20Smith=20= <93749+jdtsmith@users.noreply.github.com>=0ADate:=20Thu,=2011=20Jul=20= 2024=2016:24:17=20-0400=0ASubject:=20[PATCH]=20seconds-to-string:=20new=20= optional=20arguments=20for=20readable=0A=20strings=0A=0A---=0A=20= doc/lispref/os.texi=20=20=20=20=20=20=20=20|=20=206=20+++=0A=20etc/NEWS=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=207=20++++=0A=20= lisp/calendar/time-date.el=20|=2082=20= ++++++++++++++++++++++++++++++++++++--=0A=203=20files=20changed,=2091=20= insertions(+),=204=20deletions(-)=0A=0Adiff=20--git=20= a/doc/lispref/os.texi=20b/doc/lispref/os.texi=0Aindex=20= 3ba3da459bf..ac9d5acdf3d=20100644=0A---=20a/doc/lispref/os.texi=0A+++=20= b/doc/lispref/os.texi=0A@@=20-2155,6=20+2155,12=20@@=20Time=20= Calculations=0A=20structure.=20=20For=20instance,=20the=20120th=20day=20= in=202004=20is=20April=2029th.=0A=20@end=20defun=0A=20=0A+@defun=20= seconds-to-string=20delay=20&optional=20readable=20abbrev=20precision=0A= +Return=20a=20string=20describing=20a=20given=20@var{delay}=20(in=20= seconds).=20=20Optional=0A+arguments=20can=20be=20used=20to=20configure=20= a=20human=20readable=20delay=20using=20various=0A+formats.=20=20For=20= example,=20a=20delay=20of=209861.5=20seconds=20with=20@var{readable}=20= set=0A+to=20the=20symbol=20@code{expanded}=20returns=20@samp{2=20hours=20= 44=20minutes}.=0A+=0A=20@node=20Timers=0A=20@section=20Timers=20for=20= Delayed=20Execution=0A=20@cindex=20timers=0Adiff=20--git=20a/etc/NEWS=20= b/etc/NEWS=0Aindex=20f10f9ae4d65..1fd2a9404bb=20100644=0A---=20= a/etc/NEWS=0A+++=20b/etc/NEWS=0A@@=20-30,6=20+30,13=20@@=20applies,=20= and=20please=20also=20update=20docstrings=20as=20needed.=0A=20=0C=0A=20*=20= Changes=20in=20Emacs=2031.1=0A=20=0A+**=20Time=20&=20Date=0A+=0A++++=0A= +***=20'seconds-to-string'=20includes=20new=20formatting=20options.=0A= +Options=20are=20provided=20to=20produce=20human-readable=20delay=20= strings=20in=20a=0A+variety=20of=20formats,=20for=20example=20"6=20= months=203=20weeks"=20or=20"5m=2052.5s".=0A+=0A=20=0C=0A=20*=20Editing=20= Changes=20in=20Emacs=2031.1=0A=20=0Adiff=20--git=20= a/lisp/calendar/time-date.el=20b/lisp/calendar/time-date.el=0Aindex=20= eca80f1e8b6..5d53052a65c=20100644=0A---=20a/lisp/calendar/time-date.el=0A= +++=20b/lisp/calendar/time-date.el=0A@@=20-409,11=20+409,85=20@@=20= seconds-to-string=0A=20=20=20=20=20=20=20=20=20(list=20(*=203600=2024=20= 400)=20"d"=20(*=203600.0=2024.0))=0A=20=20=20=20=20=20=20=20=20(list=20= nil=20"y"=20(*=20365.25=2024=203600)))=0A=20=20=20"Formatting=20used=20= by=20the=20function=20`seconds-to-string'.")=0A+=0A+(defvar=20= seconds-to-string-readable=0A+=20=20`(("Y"=20"year"=20=20=20"years"=20=20= =20,(round=20(*=2060=2060=2024=20365.2425)))=0A+=20=20=20=20("M"=20= "month"=20=20"months"=20=20,(round=20(*=2060=2060=2024=2030.436875)))=0A= +=20=20=20=20("w"=20"week"=20=20=20"weeks"=20=20=20,(*=2060=2060=2024=20= 7))=0A+=20=20=20=20("d"=20"day"=20=20=20=20"days"=20=20=20=20,(*=2060=20= 60=2024))=0A+=20=20=20=20("h"=20"hour"=20=20=20"hours"=20=20=20,(*=2060=20= 60))=0A+=20=20=20=20("m"=20"minute"=20"minutes"=2060)=0A+=20=20=20=20= ("s"=20"second"=20"seconds"=201))=0A+=20=20"Formatting=20used=20by=20the=20= function=20`seconds-to-string'=20with=20READABLE=20set.=0A+The=20format=20= is=20an=20alist,=20with=20string=20keys=20ABBREV-UNIT,=20and=20elements=20= like:=0A+=0A+=20=20(ABBREV-UNIT=20UNIT=20UNIT-PLURAL=20SECS)=0A+=0A= +where=20UNIT=20is=20a=20unit=20of=20time,=20ABBREV-UNIT=20is=20the=20= abreviated=20form=20of=0A+UNIT,=20UNIT-PLURAL=20is=20the=20plural=20form=20= of=20UNIT,=20and=20SECS=20is=20the=20number=20of=0A+seconds=20per=20= UNIT.")=0A+=0A=20;;;###autoload=0A-(defun=20seconds-to-string=20(delay)=0A= -=20=20;;=20FIXME:=20There's=20a=20similar=20(tho=20fancier)=20function=20= in=20mastodon.el!=0A-=20=20"Convert=20the=20time=20interval=20in=20= seconds=20to=20a=20short=20string."=0A-=20=20(cond=20((>=200=20delay)=20= (concat=20"-"=20(seconds-to-string=20(-=20delay))))=0A+(defun=20= seconds-to-string=20(delay=20&optional=20readable=20abbrev=20precision)=0A= +=20=20"Convert=20time=20interval=20DELAY=20(in=20seconds)=20to=20a=20= string.=0A+By=20default,=20the=20returned=20string=20is=20formatted=20as=20= a=20float=20in=20the=20smallest=0A+unit=20from=20the=20variable=20= `seconds-to-string'=20that=20is=20longer=20than=20DELAY,=0A+and=20a=20= precision=20of=20two.=20=20If=20READABLE=20is=20non-nil,=20convert=20= DELAY=20into=20a=0A+readable=20string,=20using=20the=20information=20= provided=20in=20the=20variable=0A+`seconds-to-string-readable'.=20=20If=20= it=20is=20the=20symbol=20`expanded',=20use=20two=0A+units=20to=20= describe=20DELAY,=20if=20appropriate.=20=20E.g.=20\"1=20hour=2032=20= minutes\".=0A+If=20ABBREV=20is=20non-nil,=20abbreviate=20the=20readable=20= units.=20=20If=20PRECISION=20is=20a=0A+whole=20number,=20round=20the=20= value=20associated=20with=20the=20smallest=20displayed=0A+unit=20to=20= that=20many=20digits=20after=20the=20decimal.=20=20If=20it=20is=20a=20= non-negative=0A+float=20less=20than=201.0,=20round=20to=20that=20value."=0A= +=20=20(cond=20((<=20delay=200)=0A+=09=20(concat=20"-"=20= (seconds-to-string=20(-=20delay)=20readable=20precision)))=0A+=20=20=20=20= =20=20=20=20(readable=0A+=20=20=20=20=20=20=20=20=20(let*=20((stsa=20= seconds-to-string-readable)=0A+=09=09(expanded=20(eq=20readable=20= 'expanded))=0A+=09=09digits=0A+=09=09(round-to=20(cond=20((wholenump=20= precision)=0A+=09=09=09=09=20(setq=20digits=20precision)=0A+=09=09=09=09=20= (expt=2010=20(-=20precision)))=0A+=09=09=09=09((and=20(floatp=20= precision)=20(<=20precision=201.))=0A+=09=09=09=09=20(setq=20digits=20(-=20= (floor=20(log=20precision=2010))))=0A+=09=09=09=09=20precision)=0A+=09=09= =09=09(t=20(setq=20digits=200)=201)))=0A+=09=09(dformat=20(if=20(>=20= digits=200)=20(format=20"%%0.%df"=20digits)))=0A+=09=09(padding=20(if=20= abbrev=20""=20"=20"))=0A+=09=09here=20cnt=20cnt-pre=20here-pre=20cnt-val=20= isfloatp)=0A+=09=20=20=20(if=20(=3D=20(round=20delay=20round-to)=200)=0A= +=09=20=20=20=20=20=20=20(format=20"0%s"=20(if=20abbrev=20"s"=20"=20= seconds"))=0A+=09=20=20=20=20=20(while=20(and=20(setq=20here=20(pop=20= stsa))=20stsa=0A+=09=09=09=20(<=20(/=20delay=20(nth=203=20here))=201)))=0A= +=09=20=20=20=20=20(or=20(and=0A+=09=09=20=20expanded=20stsa=20=09;=20= smaller=20unit=20remains=0A+=09=09=20=20(progn=0A+=09=09=20=20=20=20= (setq=0A+=09=09=20=20=20=20=20here-pre=20here=20here=20(car=20stsa)=0A+=09= =09=20=20=20=20=20cnt-pre=20(floor=20(/=20(float=20delay)=20(nth=203=20= here-pre)))=0A+=09=09=20=20=20=20=20cnt=20(round=0A+=09=09=09=20=20(/=20= (-=20(float=20delay)=20(*=20cnt-pre=20(nth=203=20here-pre)))=0A+=09=09=09= =20=20=20=20=20(nth=203=20here))=0A+=09=09=09=20=20round-to))=0A+=09=09=20= =20=20=20(if=20(>=20cnt=200)=20t=20(setq=20cnt=20cnt-pre=20here=20= here-pre=20here-pre=20nil))))=0A+=09=09=20(setq=20cnt=20(round=20(/=20= (float=20delay)=20(nth=203=20here))=20round-to)))=0A+=09=20=20=20=20=20= (setq=20cnt-val=20(*=20cnt=20round-to)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20isfloatp=20(and=20(>=20digits=200)=0A+=09=09=09=20= =20=20=20=20=20=20=20=20=20=20=20(>=20(-=20cnt-val=20(floor=20cnt-val))=20= 0.)))=0A+=09=20=20=20=20=20(cl-labels=0A+=09=09=20((unit=20(val=20here=20= &optional=20plural)=0A+=09=09=20=20=20=20(cond=20(abbrev=20(car=20here))=0A= +=09=09=09=20=20((and=20(not=20plural)=20(<=3D=20(floor=20val)=201))=20= (nth=201=20here))=0A+=09=09=09=20=20(t=20(nth=202=20here)))))=0A+=09=20=20= =20=20=20=20=20(concat=0A+=09=09(when=20here-pre=0A+=09=09=20=20(concat=20= (number-to-string=20cnt-pre)=20padding=0A+=09=09=09=20=20(unit=20(*=20= cnt-pre=20round-to)=20here-pre)=20"=20"))=0A+=09=09(if=20isfloatp=20= (format=20dformat=20cnt-val)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(number-to-string=20(floor=20cnt-val)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20padding=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(unit=20cnt-val=20here=20isfloatp))))))=20;=20floats=20= are=20always=20plural=0A=20=20=20=20=20=20=20=20=20((=3D=200=20delay)=20= "0s")=0A=20=20=20=20=20=20=20=20=20(t=20(let=20((sts=20= seconds-to-string)=20here)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (while=20(and=20(car=20(setq=20here=20(pop=20sts)))=0A--=20=0A2.45.2=0A=0A= --Apple-Mail=_511C128D-6BDC-4E62-99FA-55E18D861F0B Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii

--Apple-Mail=_511C128D-6BDC-4E62-99FA-55E18D861F0B-- --Apple-Mail=_DDBA6E5C-506F-4C03-B7B9-3E33D5165806--