-
Notifications
You must be signed in to change notification settings - Fork 0
/
calendar-french.fr.html
1649 lines (1545 loc) · 62.4 KB
/
calendar-french.fr.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<html>
<head>
<meta http-equiv='content-type' content='Text/html; charset=utf-8' />
<title>Calendrier Républicain</title>
<style>
<!--
.insert { background-color: skyblue}
.call { background-color: yellow}
.condcode { background-color: lightgrey }
.condition { font-size-adjust: .5 }
-->
</style>
</head>
<body>
<a href='#Calendrier Républicain'>Calendrier Républicain</a>
<br /><a href='#calfr∆license'><tt>calfr∆license</tt></a>
<br /><a href='#Conversion entre calendriers'>Conversion entre calendriers</a>
<br /><a href='#Mode d_emploi'>Mode d'emploi</a>
<br /><a href='#Installation'>Installation</a>
<br /><a href='#Chargement'>Chargement</a>
<br /><a href='#Utilisation'>Utilisation</a>
<br /><a href='#calfr∆usage'><tt>calfr∆usage</tt></a>
<br /><a href='#Ordres supérieurs'>Ordres supérieurs</a>
<br /><a href='#Utilisation de "enclose"'>Utilisation de "enclose"</a>
<br /><a href='#Implémentation'>Implémentation</a>
<br /><a href='#Éléments de date'>Éléments de date</a>
<br /><a href='#calfr∆year'><tt>calfr∆year</tt></a>
<br /><a href='#calfr∆month'><tt>calfr∆month</tt></a>
<br /><a href='#calfr∆day'><tt>calfr∆day</tt></a>
<br /><a href='#calfr∆zerojanvnd'><tt>calfr∆zerojanvnd</tt> - Notion de « jour zéro »</a>
<br /><a href='#calfr∆fr2rd'><tt>calfr∆fr2rd</tt> - Conversion du calendrier républicain vers <i lang='la'>Rata Die</i></a>
<br /><a href='#calfr∆frbis'><tt>calfr∆frbis</tt> - Nombre d'années bissextiles avant l'année N (calendrier républicain)</a>
<br /><a href='#calfr∆gr2rd'><tt>calfr∆gr2rd</tt> - Conversion du calendrier grégorien vers <i lang='la'>Rata Die</i></a>
<br /><a href='#calfr∆rd2fr'><tt>calfr∆rd2fr</tt> - Conversion du <i lang='la'>Rata Die</i> vers le calendrier républicain</a>
<br /><a href='#calfr∆rd2gr'><tt>calfr∆rd2gr</tt> - Conversion du <i lang='la'>Rata Die</i> vers le calendrier grégorien</a>
<br /><a href='#Les fonctions de conversion'>Les fonctions de conversion</a>
<br /><a href='#calfr∆gr2fr'><tt>calfr∆gr2fr</tt> - Conversion du calendrier grégorien vers le calendrier républicain</a>
<br /><a href='#calfr∆fr2gr'><tt>calfr∆fr2gr</tt> - Conversion du calendrier républicain vers le calendrier grégorien</a>
<br /><a href='#Affichage des dates'>Affichage des dates</a>
<br /><a href='#calfr∆prtfr'><tt>calfr∆prtfr</tt> - Affichage d'une date du calendrier républicain</a>
<br /><a href='#calfr∆roman'><tt>calfr∆roman</tt> - Conversion d'un nombre en chiffres romains</a>
<br /><a href='#calfr∆nodes'><tt>calfr∆nodes</tt> - Construction des nœuds de la numération romaine</a>
<br /><a href='#calfr∆feasts'><tt>calfr∆feasts</tt> - Fêtes du calendrier républicain</a>
<br /><a href='#Tests internes'>Tests internes</a>
<br /><a href='#calfr∆testdata'><tt>calfr∆testdata</tt> - Données pour les tests</a>
<br /><a href='#calfr∆teststring'><tt>calfr∆teststring</tt> - Données alphanumériques de tests</a>
<br /><a href='#calfr∆alltests'><tt>calfr∆alltests</tt> - Lancement de tous les tests</a>
<br /><a href='#calfr∆testfr2rd'><tt>calfr∆testfr2rd</tt></a>
<br /><a href='#calfr∆test0fr2rd'><tt>calfr∆test0fr2rd</tt></a>
<br /><a href='#calfr∆test1fr2rd'><tt>calfr∆test1fr2rd</tt></a>
<br /><a href='#calfr∆testgr2rd'><tt>calfr∆testgr2rd</tt></a>
<br /><a href='#calfr∆test0gr2rd'><tt>calfr∆test0gr2rd</tt></a>
<br /><a href='#calfr∆test1gr2rd'><tt>calfr∆test1gr2rd</tt></a>
<br /><a href='#calfr∆testrd2fr'><tt>calfr∆testrd2fr</tt></a>
<br /><a href='#calfr∆test0rd2fr'><tt>calfr∆test0rd2fr</tt></a>
<br /><a href='#calfr∆test1rd2fr'><tt>calfr∆test1rd2fr</tt></a>
<br /><a href='#calfr∆testrd2gr'><tt>calfr∆testrd2gr</tt></a>
<br /><a href='#calfr∆test0rd2gr'><tt>calfr∆test0rd2gr</tt></a>
<br /><a href='#calfr∆test1rd2gr'><tt>calfr∆test1rd2gr</tt></a>
<br /><a href='#calfr∆testgr2fr'><tt>calfr∆testgr2fr</tt></a>
<br /><a href='#calfr∆test0gr2fr'><tt>calfr∆test0gr2fr</tt></a>
<br /><a href='#calfr∆test1gr2fr'><tt>calfr∆test1gr2fr</tt></a>
<br /><a href='#calfr∆testfr2gr'><tt>calfr∆testfr2gr</tt></a>
<br /><a href='#calfr∆test0fr2gr'><tt>calfr∆test0fr2gr</tt></a>
<br /><a href='#calfr∆test1fr2gr'><tt>calfr∆test1fr2gr</tt></a>
<br /><a href='#calfr∆testprtfr'><tt>calfr∆testprtfr</tt></a>
<br /><a href='#Voir également'>Voir également</a>
<br /><a href='#Logiciels'>Logiciels</a>
<br /><a href='#Internet'>Internet</a>
<br /><a href='#Livres'>Livres</a>
<hr /><h1><a name='Calendrier Républicain'>Calendrier Républicain</a></h1>
<h2><a name='calfr∆license'><tt>calfr∆license</tt></a></h2>
<p>
La partie texte de ce dépôt git est distribuée sous la licence
Creative Commons avec attribution et partage dans les mêmes
conditions (CC-BY-SA). La partie code de ce dépôt est distribuée
sous la licence GPL version 1.0 ou ultérieure.
</p>
<p>
Ainsi que le requiert la licence GPL, tout fichier de code
doit commencer par un commentaire décrivant de façon sommaire
le logiciel et résumant la GPL. La description sommaire en français :</p>
<p>
« Les fonctions de ce script permettent de faire des conversions
du calendrier grégorien vers le calendrier républicain et vice-versa. »</p>
<p>
Quant au résumé de la GPL, le voici, en anglais (je ne suis
pas assez calé pour traduire en français un texte de teneur juridique).
</p>
<pre>
∇ calfr∆license
'APL program to convert Gregorian dates'
'to French Revolutionary dates and the other way'
''
'Copyright (C) 2015, 2016 Jean Forget (JFORGET at cpan dot org)'
''
'Build date:'
''
'Portability: L1 (tested with GNU-APL and NARS2000)'
''
' This program is distributed under the GNU Public License version 1 or later'
''
' You can find the text of the license in the LICENSE file or at'
' http://www.gnu.org/licenses/gpl-1.0.html.'
''
' Here is the summary of GPL:'
''
' This program is free software; you can redistribute it and/or modify'
' it under the terms of the GNU General Public License as published by'
' the Free Software Foundation; either version 1, or (at your option)'
' any later version.'
''
' This program is distributed in the hope that it will be useful,'
' but WITHOUT ANY WARRANTY; without even the implied warranty of'
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the'
' GNU General Public License for more details.'
''
' You should have received a copy of the GNU General Public License'
' along with this program; if not, write to the Free Software Foundation,'
' Inc., <http://www.fsf.org/>.'
∇
</pre>
<p>
Comme vous pouvez le deviner, ce résumé fait partie intégrante du
logiciel. Donc, une fois que vous êtes entrés sous APL et que vous
avez initialisé votre espace de travail avec mon script, vous pouvez
à tout moment afficher ce résumé.
</p>
<p>
Portabilité : en convertissant le fichier script en fichier ATF, on
peut charger les fonctions sous NARS2000. Juste un hic, les lettres
accentuées et c-cédille déclenchent une erreur de syntaxe. La chaîne
de compilation remplace donc ces lettres par des lettres inoffensives,
voyelles sans accent et « c » sans cédille.
Avec cette précaution, les programmes fonctionnent parfaitement sous NARS2000.
</p>
<h2><a name='Conversion entre calendriers'>Conversion entre calendriers</a></h2>
<p>
Cette série de fonctions s'applique à trois calendriers
différents.</p>
<dl>
<dt> Le calendrier républicain</dt>
<dd> Le calendrier républicain a été en vigueur en France
de 1792 à 1805, mais les fonctions de ce script permettent
d'utiliser des dates jusqu'à aujourd'hui et au-delà.
Les dates sont représentées par un vecteur de trois nombres au format AAAA MM JJ.
Il y a douze mois de 30 jours chacun, plus 5 ou 6 jours
complémentaires à la fin de l'année. Pour des raisons de simplicité,
ces jours complémentaires constituent un mois supplémentaire numéroté 13.
</dd>
<dt> Le calendrier grégorien proleptique</dt>
<dd> Il s'agit du
calendrier grégorien, extrapolé dans le passé au-delà
de l'année 1582.
Non seulement la règle des années bissextiles est celle du
calendrier grégorien, mais en plus on considère que l'année
commence toujours le premier janvier, ce qui n'était pas toujours
le cas avec les calendriers réellement en usage au Moyen-Âge.
Les dates grégoriennes sont exprimées sous la forme d'un
vecteur de trois nombres, au format AAAA MM JJ.</dd>
<dt> Le <i lang='la'>Rata Die</i> (RD)</dt>
<dd> C'est un calendrier qui
ignore totalement les années. Il ne compte que les jours, à partir
du 1<sup>er</sup> janvier de l'an 1 du calendrier grégorien
proleptique. Très pratique pour les
programmes, beaucoup moins pour les humains.
En fait, le calendrier <i lang='la'>Rata Die</i> ne vous servira
pas en tant que tel, c'est simplement un intermédiaire entre
les deux autres. Vous pouvez en avoir besoin quand même par
exemple pour calculer le nombre de jours entre deux dates.
</dd>
</dl>
<h2><a name='Mode d_emploi'>Mode d'emploi</a></h2>
<h3><a name='Installation'>Installation</a></h3>
<p>
Le fichier <tt>calfr.apl</tt> doit se trouver
dans le sous-répertoire <tt>workspaces</tt>, pour compatibilité
avec la commande <tt>)LOAD</tt>. Vous pouvez stocker ce fichier
dans un sous-répertoire <tt>wslib</tt><var>n</var> (<var>n</var>
valant de 1 à 9), auquel cas vous devrez utiliser la variante
<tt>)LOAD</tt> <var>n</var> <tt>calfr.apl</tt>.
De même, là où le mode d'emploi indique la commande <tt>)LOAD</tt>,
vous pouvez utiliser les variantes <tt>)XLOAD</tt> ou <tt>)COPY</tt>.
</p>
<p>
Installation pour GNU-APL à partir de <a href='https://github.com/jforget/apl-calendar-french'>GitHub</a> :
vous pouvez cloner le dépôt et copier <tt>workspaces/calfr.apl</tt>
vers le sous-répertoire <tt>workspaces</tt> de votre répertoire APL.
Ou alors, affichez <a href='https://github.com/jforget/apl-calendar-french/blob/master/workspaces/calfr.apl'>https://github.com/.../calfr.apl</a>
en mode <i lang='en'>raw</i> et sauvegardez-le en mode « texte seul »
dans le sous-répertoire <tt>workspaces</tt> de votre répertoire APL.
</p>
<p>
Installation pour GNU-APL à partir de <a href='https://www.gnu.org/software/apl/Bits_and_Pieces/'>GNU-APL Bits and Pieces</a> :
sauvegardez le fichier affiché en mode « texte seul » dans le sous-répertoire <tt>workspace</tt>.
Ne vous préoccupez pas de tout le texte en anglais et en français, il sera masqué lors du chargement sous APL.
</p>
<p>
Installation pour NARS2000 à partir de <a href='https://github.com/jforget/apl-calendar-french'>GitHub</a> :
clonez le dépôt et copier <tt>workspaces/calfrnars.atf</tt>
vers le répertoire <tt>c:\user\moi-meme\Application Data\NARS2000\workspaces</tt> ou, si vous utilisez GNU/Linux et Wine :
<tt>/home/moi-meme/.wine/drive_c/users/moi-meme/Application Data/NARS2000/workspaces</tt>.
</p>
<h3><a name='Chargement'>Chargement</a></h3>
<p>
Chargement dans GNU-APL : vous chargez un espace de travail initialisé avec les fonctions
de conversion par :
</p>
<pre>
apl -f workspaces/calfr.apl
</pre>
<p>
ou bien avec :
</p>
<pre>
apl
)LOAD calfr
</pre>
<p>
Chargement dans NARS2000 : vous chargez un espace de travail initialisé avec les fonctions
de conversion par :
</p>
<pre>
)IN calfrnars
</pre>
<h3><a name='Utilisation'>Utilisation</a></h3>
<p>
Vous vous retrouvez alors dans la boucle REPL (lecture,
évaluation, impression et boucle) d'APL. Vous pouvez alors
demander la conversion du 13 Vendémiaire IV ainsi :
</p>
<pre>
calfr∆fr2gr 4 1 13
1795 10 5
</pre>
<p>
ce qui veut dire que le 13 Vendémiaire IV correspond au
5 octobre 1795. Dans l'autre sens, la conversion du
27 juillet 1794 se fait ainsi :
</p>
<pre>
calfr∆gr2fr 1794 7 27
2 11 9
</pre>
<p>
ce qui signifie 9 Thermidor II. Pour avoir la date
sous forme plus agréable, utilisez <tt>calfr∆prtfr</tt> :
</p>
<pre>
calfr∆prtfr 2 11 9
Nonidi 9 Thermidor II, jour de la Mûre
calfr∆prtfr calfr∆gr2fr 1794 7 27
Nonidi 9 Thermidor II, jour de la Mûre
</pre>
<p>
Et pour avoir la date du jour
</p>
<pre>
calfr∆prtfr calfr∆gr2fr 3↑⎕TS
</pre>
<p>
Si vous voulez calculer le nombre de jours entre deux
dates, utilisez le <i lang='la'>Rata Die</i>. Par
exemple, vous voulez savoir combien de jours séparent
le coup d'état du neveu (2 décembre 1851) du coup d'état
de l'oncle (18 Brumaire VIII). Il suffit de taper :
</p>
<pre>
(calfr∆gr2rd 1851 12 2) - calfr∆fr2rd 8 2 18
19015
</pre>
<h3><a name='calfr∆usage'><tt>calfr∆usage</tt></a></h3>
<p>
Voici l'aide en ligne en anglais.
</p>
<pre>
⍝ Installing from GitHub (https://github.com/jforget/apl-calendar-french):
⍝ clone the Git repo and copy "workspaces/calfr.apl" to the "workspaces" sub-directory of your GNU-APL directory
⍝ or copy "workspaces/calfrnars.atf" to some place where NARS2000 will find it
⍝ Installing from browsing https://www.gnu.org/software/apl/Bits_and_Pieces/
⍝ save the webpage as simple text into the "workspaces" sub-directory of your GNU-APL directory
∇ calfr∆usage
'Loading the module from the command line (for GNU-APL):'
' apl -f workspaces/calfr.apl'
'Loading the module from inside GNU-APL:'
' )LOAD calfr'
'Loading the module from inside NARS2000:'
' )IN calfrnars'
'Dates are vectors of 3 numbers YYYY MM DD. e.g.'
' DR ← 8 2 18 ⍝ for 18 Brumaire VIII'
' DG ← 1794 7 27 ⍝ for 27th July 1794'
'Gregorian to French Revolutionary:'
' DR ← calfr∆gr2fr DG'
'French Revolutionary to Gregorian:'
' DG ← calfr∆fr2gr DR'
'Pretty-printing:'
' STRING ← calfr∆prtfr DR'
'Pretty-printing today''s date:'
' STRING ← calfr∆prtfr calfr∆gr2fr 3↑⎕TS'
∇
</pre>
<h3><a name='Ordres supérieurs'>Ordres supérieurs</a></h3>
<p>
Une date est représentée par un vecteur de 3 nombres. On peut
organiser les dates en un vecteur de dates, qui sera en réalité
un tableau de nombres. Ainsi, un vecteur de 5 dates sera un tableau de dimension <tt>5 3</tt>.</p>
<p>
Par exemple, le vecteur de dates :
</p>
<table border='1' cellpadding='2'><tr>
<td>21-JAN-1794</td><td>5-OCT-1795</td><td>9-NOV-1799</td><td>2-DEC-1851</td><td>31-MAR-2015</td>
</tr></table>
<p>
sera représenté par :
</p>
<pre>
DATEVEC
1794 1 21
1795 10 5
1799 11 9
1851 12 2
2015 3 31
⍴ DATEVEC
5 3
</pre>
<p>
De la même manière, un tableau <tt>4 5</tt> de dates sera représenté
par un bloc <tt>4 5 3</tt> de nombres, un bloc <tt>2 2 6</tt> de dates
sera représenté par un bloc <tt>2 2 6 3</tt> de nombres, et ainsi
de suite. Les fonctions <tt>calfr∆gr2fr</tt> et <tt>calfr∆fr2gr</tt> sont compatibles
avec toutes ces structures, sauf lorsque l'on arrive au voisinage du rang maximal.
Par exemple, sur cette implémentation d'APL le rang maximal est 8, donc les fonctions commencent
à provoquer des erreurs avec une structure de rang 7.</p>
<p>
Ainsi, la conversion du vecteur ci-dessus se fait par :
</p>
<pre>
calfr∆gr2fr DATEVEC
2 5 2
4 1 13
8 2 18
60 3 11
223 7 11
</pre>
<p>
Par contre, la fonction <tt>calfr∆prtfr</tt> n'est pas compatible avec les vecteurs
de dates ou les tableaux de dates. Elle accepte seulement les dates scalaires.
</p>
<h3><a name='Utilisation de "enclose"'>Utilisation de "enclose"</a></h3>
<p>
Je sais que APL permet d'inclure des objets dans d'autres, avec
les opérateurs <tt>⊂</tt> et <tt>⊃</tt>. Mais cela n'existait pas lorsque j'ai appris APL
il y a plus de trente ans. J'ai donc écrit le présent script sans chercher à utiliser
ces opérateurs. J'avais l'intention d'écrire dans un deuxième temps un nouveau script
qui reposerait sur <tt>⊂</tt> et <tt>⊃</tt>.</p>
<p>
Mais j'ai fait quelques expériences avec le script dans l'état actuel.
En utilisant la fonction <tt>¨</tt> (<i lang='en'>each</i>), les fonctions
deviennent compatibles avec les objets « enclosed ». Exemple :
</p>
<pre>
V ← 2 2 ⍴ (1792 9 22) (1795 10 5) (1799 11 9), ⊂ 3↑⎕TS
V
1792 9 22 1795 10 5
1799 11 9 2015 12 24
⍴V
2 2
V1 ← calfr∆prtfr ¨ calfr∆gr2fr ¨ V
V1
Primidi 1 Vendémiaire I, jour du Raisin Tridi 13 Vendémiaire IV, jour du Potiron
Octidi 18 Brumaire VIII, jour de la Dentelaire Quartidi 4 Nivôse CCXXIV, jour du Soufre
⍴V1
2 2
</pre>
<h2><a name='Implémentation'>Implémentation</a></h2>
<h3><a name='Éléments de date'>Éléments de date</a></h3>
<p>
Pour extraire l'année d'une date <tt>DATE</tt>, il suffit d'écrire <tt>DATE[1]</tt>.
Pour en extraire le jour, il suffit d'écrire <tt>DATE[3]</tt>.
Mais cela ne fonctionne pas avec les vecteurs de dates pour lesquels il faut
écrire <tt>DATEVEC[;1]</tt> et <tt>DATEVEC[;3]</tt>,
ni avec les tableaux de dates pour lesquel il faut écrire
<tt>DATEARRAY[;;1]</tt> et <tt>DATEARRAY[;;3]</tt>.
Il y a plusieurs façons de s'en tirer et d'avoir une fonction compatible avec
tous les rangs et toutes les dimensions. La plus simple consiste à écrire :
</p>
<h4><a name='calfr∆year'><tt>calfr∆year</tt></a></h4>
<pre>
∇ R ← calfr∆year D
R ← D +.× 1 0 0
∇
</pre>
<h4><a name='calfr∆month'><tt>calfr∆month</tt></a></h4>
<pre>
∇ R ← calfr∆month D
R ← D +.× 0 1 0
∇
</pre>
<h4><a name='calfr∆day'><tt>calfr∆day</tt></a></h4>
<pre>
∇ R ← calfr∆day D
R ← D +.× 0 0 1
∇
</pre>
<h3><a name='calfr∆zerojanvnd'><tt>calfr∆zerojanvnd</tt> - Notion de « jour zéro »</a></h3>
<p>
Pour comprendre comment les algorithmes de conversion fonctionnent, il est
utile d'utiliser la notion de « jour zéro » pour un mois donné.
Le jour zéro est un jour virtuel situé avant le premier jour du mois et
après le dernier jour du mois précédent. Ainsi, le 0 mars 2015 se situe
après le 28 février 2015 et avant le 1<sup>er</sup> mars 2015.
Le fait que son <i lang='la'>Rata Die</i> soit identique à celui du 28 février
ne change rien au fait qu'il est censé se situer après le 28 février.
</p>
<p>
Voici une fonction qui permet de construire le 0 janvier d'une année ou le 0 Vendémiaire
d'une année :
</p>
<pre>
∇ R ← calfr∆zerojanvnd Y
R ← Y ∘.× 1 0 0
R ← R + (⍴R) ⍴ 0 1 0
∇
</pre>
<h3><a name='calfr∆fr2rd'><tt>calfr∆fr2rd</tt> - Conversion du calendrier républicain vers <i lang='la'>Rata Die</i></a></h3>
<p>
Commençons par calculer le <i lang='la'>Rata Die</i> d'une date du calendrier républicain.
Il faut ajouter les termes suivants :</p>
<ul>
<li>654414, qui est le <i lang='la'>Rata Die</i> du zéro Vendémiaire I,</li>
<li>(AAAA - 1) × 365, le nombre de jours du zéro Vendémiaire I au zéro Vendémiaire de l'année demandée,
en oubliant les jours bissextiles, c'est-à-dire les « 6 jour complémentaire »,</li>
<li>calfr∆frbis(AAAA), qui compte combien d'années bissextiles ont précédé l'année demandée,</li>
<li>(MM - 1) × 30, le nombre de jours du zéro Vendémiaire au jour zéro du mois demandé,</li>
<li>JJ, pour arriver finalement au jour demandé.</li>
</ul>
<p>
En fait, on rassemble toutes les constantes additives en une seule, ce qui donne le calcul suivant :</p>
<ul>
<li>AAAA × 365,</li>
<li>calfr∆frbis(AAAA),</li>
<li>MM × 30,</li>
<li>JJ,</li>
<li>constante additive.</li>
</ul>
<pre>
∇ R ← calfr∆fr2rd DATE
R ← 654019 + (<a href='#calfr∆frbis' class='call'>calfr∆frbis</a> <a href='#calfr∆year' class='call'>calfr∆year</a> DATE) + DATE +.× 365 30 1
∇
</pre>
<h3><a name='calfr∆frbis'><tt>calfr∆frbis</tt> - Nombre d'années bissextiles avant l'année N (calendrier républicain)</a></h3>
<p>
Cette fonction donne le nombre d'années bissextiles
qui ont eu lieu avant l'année en paramètre. Elle permet
d'affiner le calcul de la date, par rapport à l'estimation
obtenue en prenant des années à 365 jours.</p>
<p>
La règle pour les années bissextiles était une règle astronomique
jusqu'en l'an XX, le premier Vendémiaire devant coïncider avec
l'équinoxe d'automne. Ensuite, la réforme de Gilbert Romme
aurait fait appliquer une règle arithmétique analogue à
celle du calendrier grégorien.</p>
<p>
La règle de Romme indique qu'une année est bissextile si elle est divisible par 4, sauf
si elle est divisible par 100, mais elle l'est quand même si
elle est divisible par 400, sauf si elle est divisible par 4000.
</p>
<p>
Voici la comparaison des deux règles pour le début de l'ère
républicaine. Les deux colonnes « arithmétique »
simulent l'hypothèse où la règle arithmétique aurait été
en vigueur dès le début. Les deux colonnnes « astronomique »
présentent le cas réel : règle astronomique au début
et règle arithmétique ensuite. Les colonnes « Bis ? »
indiquent par un « X » si l'année est bissextile
en fonction de la règle utilisée. Les colonnes « frbis »
indiquent le nombre d'années bissextiles avant l'année considérée,
ce qui correspond au résultat de la fonction <tt>calfr∆frbis</tt>.
</p>
<table border='1'>
<tr align='center'><td> </td><td colspan='2'>Arithmétique</td><td colspan='2'>Astronomique</td></tr>
<tr align='center'><td>Année</td><td>Bis ?</td><td>frbis </td><td>Bis ?</td><td>frbis </td></tr>
<tr align='center'><td> 1 </td><td> </td><td> 0 </td><td> </td><td> 0 </td></tr>
<tr align='center'><td> 2 </td><td> </td><td> 0 </td><td> </td><td> 0 </td></tr>
<tr align='center'><td> 3 </td><td> </td><td> 0 </td><td> x </td><td> 0 </td></tr>
<tr align='center'><td> 4 </td><td> x </td><td> 0 </td><td> </td><td> 1 </td></tr>
<tr align='center'><td> 5 </td><td> </td><td> 1 </td><td> </td><td> 1 </td></tr>
<tr align='center'><td> 6 </td><td> </td><td> 1 </td><td> </td><td> 1 </td></tr>
<tr align='center'><td> 7 </td><td> </td><td> 1 </td><td> x </td><td> 1 </td></tr>
<tr align='center'><td> 8 </td><td> x </td><td> 1 </td><td> </td><td> 2 </td></tr>
<tr align='center'><td> 9 </td><td> </td><td> 2 </td><td> </td><td> 2 </td></tr>
<tr align='center'><td> 10 </td><td> </td><td> 2 </td><td> </td><td> 2 </td></tr>
<tr align='center'><td> 11 </td><td> </td><td> 2 </td><td> x </td><td> 2 </td></tr>
<tr align='center'><td> 12 </td><td> x </td><td> 2 </td><td> </td><td> 3 </td></tr>
<tr align='center'><td> 13 </td><td> </td><td> 3 </td><td> </td><td> 3 </td></tr>
<tr align='center'><td> 14 </td><td> </td><td> 3 </td><td> </td><td> 3 </td></tr>
<tr align='center'><td> 15 </td><td> </td><td> 3 </td><td> x </td><td> 3 </td></tr>
<tr align='center'><td> 16 </td><td> x </td><td> 3 </td><td> </td><td> 4 </td></tr>
<tr align='center'><td> 17 </td><td> </td><td> 4 </td><td> </td><td> 4 </td></tr>
<tr align='center'><td> 18 </td><td> </td><td> 4 </td><td> </td><td> 4 </td></tr>
<tr align='center'><td> 19 </td><td> </td><td> 4 </td><td> </td><td> 4 </td></tr>
<tr align='center'><td> 20 </td><td> x </td><td> 4 </td><td> x </td><td> 4 </td></tr>
<tr align='center'><td> 21 </td><td> </td><td> 5 </td><td> </td><td> 5 </td></tr>
<tr align='center'><td> 22 </td><td> </td><td> 5 </td><td> </td><td> 5 </td></tr>
<tr align='center'><td> 23 </td><td> </td><td> 5 </td><td> </td><td> 5 </td></tr>
<tr align='center'><td> 24 </td><td> x </td><td> 5 </td><td> x </td><td> 5 </td></tr>
<tr align='center'><td> 25 </td><td> </td><td> 6 </td><td> </td><td> 6 </td></tr>
</table>
<p>
En fait, les deux règles n'engendrent une différence que pour
les années IV, VIII, XII et XVI. Donc le sous-programme effectue
le calcul avec la règle arithmétique dès l'an I, puis rectifie le résultat
si l'on a l'une de ces quatre années. N'oubliez pas que le sous-programme
commence par soustraire 1 à l'année, c'est pour cela qu'il teste
les valeurs 3, 7, 11 et 15.
</p>
<pre>
∇ R ← calfr∆frbis YEAR
YEAR ← YEAR - 1
R ← - / ⌊ YEAR ∘.÷ 4 100 400 4000
R ← R + YEAR ∈ 3 7 11 15
∇
</pre>
<h3><a name='calfr∆gr2rd'><tt>calfr∆gr2rd</tt> - Conversion du calendrier grégorien vers <i lang='la'>Rata Die</i></a></h3>
<p>
Malgré les critères pour les années bissextiles, la conversion du calendrier
républicain vers le <i lang='la'>Rata Die</i> est simple, comparée avec
la fonction correspondante du calendrier grégorien. En effet, la période
bouche-trou (jours complémentaires) est à la fin de l'année donc sa longueur variable
et plus faible que les mois normaux n'a pas d'influence sur les calculs.
En revanche, dans le calendrier grégorien, le mois bouche-trou, février, apparaît
au début de l'année et complique le calcul pour les mois suivants.
De plus, la longueur des autres mois est variable : 30 ou 31 jours.
</p>
<p>
C'est pourquoi nous introduisons un nouveau calendrier, le « calendrier grégorien
décalé ». Dans ce calendrier, les mois de janvier et février sont transférés
à la fin de l'année précédente et l'année commence au 1<sup>er</sup> mars.
De plus, pour les raisons exposées ci-dessous, les mois sont numérotés de 4 (mars)
à 15 (février), pour la raison exposée ci-dessous.</p>
<p>
Ainsi le 28 février 2015 devient <tt>2014 15 28</tt> et le premier mars 2015
devient <tt>2015 4 1</tt>.
</p>
<p>
Dans le tableau ci-dessous, la partie gauche s'intéresse au nombre de mois à 31 jours
qui précèdent le mois courant dans l'année décalée. La partie droite explique le calcul du nombre de jours
depuis le zéro mars jusqu'au jour zéro du mois courant.
</p>
<table border='1'>
<tr align='center'><th>M</th><th>nb31</th><th> M</th><th>0.6 × M</th><th>¯2 + ⌊ 0.6 × M</th><th>M</th><th> ln </th><th> nb</th><th>30.6 × M</th><th>¯122 + ⌊ 30.6 × M</th></tr>
<tr align='right'> <td>M</td><td> 0 </td><td> 4</td><td> 2.4 </td><td> 0 </td><td>M</td><td> 31 </td><td> 0</td><td> 122.4</td><td> 0 </td></tr>
<tr align='right'> <td>A</td><td> 1 </td><td> 5</td><td> 3.0 </td><td> 1 </td><td>A</td><td> 30 </td><td> 31</td><td> 153.0</td><td> 31 </td></tr>
<tr align='right'> <td>M</td><td> 1 </td><td> 6</td><td> 3.6 </td><td> 1 </td><td>M</td><td> 31 </td><td> 61</td><td> 183.6</td><td> 61 </td></tr>
<tr align='right'> <td>J</td><td> 2 </td><td> 7</td><td> 4.2 </td><td> 2 </td><td>J</td><td> 30 </td><td> 92</td><td> 214.2</td><td> 92 </td></tr>
<tr align='right'> <td>J</td><td> 2 </td><td> 8</td><td> 4.8 </td><td> 2 </td><td>J</td><td> 31 </td><td>122</td><td> 244.8</td><td> 122 </td></tr>
<tr align='right'> <td>A</td><td> 3 </td><td> 9</td><td> 5.4 </td><td> 3 </td><td>A</td><td> 31 </td><td>153</td><td> 275.4</td><td> 153 </td></tr>
<tr align='right'> <td>S</td><td> 4 </td><td>10</td><td> 6.0 </td><td> 4 </td><td>S</td><td> 30 </td><td>184</td><td> 306.0</td><td> 184 </td></tr>
<tr align='right'> <td>O</td><td> 4 </td><td>11</td><td> 6.6 </td><td> 4 </td><td>O</td><td> 31 </td><td>214</td><td> 336.6</td><td> 214 </td></tr>
<tr align='right'> <td>N</td><td> 5 </td><td>12</td><td> 7.2 </td><td> 5 </td><td>N</td><td> 30 </td><td>245</td><td> 367.2</td><td> 245 </td></tr>
<tr align='right'> <td>D</td><td> 5 </td><td>13</td><td> 7.8 </td><td> 5 </td><td>D</td><td> 31 </td><td>275</td><td> 397.8</td><td> 275 </td></tr>
<tr align='right'> <td>J</td><td> 6 </td><td>14</td><td> 8.4 </td><td> 6 </td><td>J</td><td> 31 </td><td>306</td><td> 428.4</td><td> 306 </td></tr>
<tr align='right'> <td>F</td><td> 7 </td><td>15</td><td> 9.0 </td><td> 7 </td><td>F</td><td>28? 29?</td><td>337</td><td> 459.0</td><td> 337 </td></tr>
</table>
<p>
Voici donc la fonction :
</p>
<pre>
∇ R ← calfr∆gr2rd DATE; DIM
DIM ← ⍴ DATE
DATE←(DIM ⍴0 1 0) + DATE + (2≥<a href='#calfr∆month' class='call'>calfr∆month</a> DATE) ∘.× ¯1 12 0
R ← ¯428 + (-/ ⌊ (<a href='#calfr∆year' class='call'>calfr∆year</a> DATE) ∘.÷ 4 100 400) + ⌊DATE +.× 365 30.6 1
∇
</pre>
<h3><a name='calfr∆rd2fr'><tt>calfr∆rd2fr</tt> - Conversion du <i lang='la'>Rata Die</i> vers le calendrier républicain</a></h3>
<p>
Principe : en partant de la valeur <i lang='la'>Rata Die</i>, la fonction évalue
une fourchette pour l'année, qui peut donc s'étaler de <tt>YL</tt> à <tt>YH</tt>.
Supposons que l'on parte de la valeur <i lang='la'>Rata Die</i> 672800,
avec une fourchette de 50 à 53.
Le sous-programme construit ensuite la liste <tt>YR</tt> des années de la fourchette, soit dans
l'exemple un vecteur <tt>YR</tt> valant <tt>50 51 52 53</tt>.
Puis le sous-programme transforme ce vecteur d'années en vecteurs de dates <tt>DR</tt>,
correspondant au zéro Vendémiaire de chaque année, ce qui donnerait :
</p>
<pre>
DR
50 1 0
51 1 0
52 1 0
53 1 0
</pre>
<p>
La fonction <a href='#calfr∆fr2rd'><tt>calfr∆fr2rd</tt></a> convertit cela en <i lang='la'>Rata Die</i>
</p>
<pre>
NR
672311 672676 673041 673407
</pre>
<p>
et compare avec la valeur initiale 672800, ce qui donne :
</p>
<pre>
CM
1 1 0 0
</pre>
<p>
Cela permet d'avoir l'année de la date
en prenant l'année la plus élevée pour laquelle la valeur dans <tt>NR</tt> est inférieure
à la valeur du paramètre d'entrée <tt>N</tt>.
Dans l'exemple ci-dessus, on en déduit que l'année est 51. En faisant la différence
des deux valeurs <i lang='la'>Rata Die</i>, on obtient 124, ce qui est facilement
converti en 4 Pluviôse (<tt>5 4</tt>) avec de simples divisions par 30.
</p>
<p>
Remarque : dans l'exemple ci-dessus, la plage d'années avait 4 valeurs.
Dans la réalité, la plage n'aura qu'une seule valeur, parfois deux au voisinage
des changements d'année. Le choix de 4 valeurs avait un rôle pédagogique.
En fait, la première date pour laquelle la plage comporte trois valeurs est l'année
3744 et il faut attendre 7480 pour qu'elle compte quatre valeurs.
</p>
<p>
Autre remarque : lorsque le paramètre en entrée n'est pas un scalaire, mais un
vecteur, un tableau ou une structure d'ordre plus élevé, les variables intermédiaires
ont également un ordre plus élevé. Le seul point délicat est de savoir ce qui
se passe lorsque l'une des valeurs <i lang='la'>Rata Die</i> donne une plage
de 1 valeur et l'autre une plage de 2 valeurs (par exemple). Dans ce cas,
la plage de valeurs du premier <i lang='la'>Rata Die</i> est allongée à 2 valeurs
pour conserver la rectangularité de la variable <tt>YR</tt>.
</p>
<pre>
∇ R ← calfr∆rd2fr N; ⎕IO; N1; YH; YL; YI; YR; DR; NR; CM; Y; M; D
⎕IO ← 1
N1 ← N - 654414
YH ← ⌈ N1 ÷ 365.24
YL ← ⌈ N1 ÷ 365.34
YI ← 0 , ⍳ ⌈/,YH-YL
YR ← YL ∘.+ YI
DR ← <a href='#calfr∆zerojanvnd' class='call'>calfr∆zerojanvnd</a> YR
NR ← <a href='#calfr∆fr2rd' class='call'>calfr∆fr2rd</a> DR
CM ← NR < N ∘.+ (⍴YI)⍴0
Y ← ⌈/YR×CM
D ← N - ⌈/NR×CM
M ← ⌈D÷30
D ← D - 30 × M - 1
R ← (Y ∘.× 1 0 0) + (M ∘.× 0 1 0) + D ∘.× 0 0 1
∇
</pre>
<p>
Résumé des variables locales :</p>
<table>
<tr><td>YH</td><td>year (high) </td><td>borne supérieure de la plage d'années </td></tr>
<tr><td>YL</td><td>year (low) </td><td>borne inférieure de la plage d'années </td></tr>
<tr><td>YI</td><td>year increments </td><td>vecteur d'incréments pour construire la plage d'années</td></tr>
<tr><td>YR</td><td>year range </td><td>plage d'années </td></tr>
<tr><td>DR</td><td>date range </td><td>plage de dates (0 Vendémiaire) </td></tr>
<tr><td>NR</td><td>number range </td><td>plage de nombres (<i lang='la'>Rata Die</i>) </td></tr>
<tr><td>CM</td><td>comparison </td><td>résultat de la comparaison </td></tr>
<tr><td>Y </td><td>year final value </td><td>valeur finale de l'année </td></tr>
<tr><td>D </td><td>day final value </td><td>valeur finale du jour </td></tr>
<tr><td>M </td><td>month final value</td><td>valeur finale du mois </td></tr>
</table>
<p>
Voici un exemple d'exécution avec un vecteur en entrée. Notons que pour le premier
nombre, la plage de valeurs de la date comportait une seule année, l'année 400.
Mais par « contamination » de la dernière valeur, cette plage a été
étendue à trois années.
</p>
<p>
<pre>
V←800505 800511 800879 2115019
calfr∆rd2fr V
400 12 30
400 13 6
402 1 3
4000 1 1
YH
400 401 402 4000
YL
400 400 401 3998
YI
0 1 2
YR
400 401 402
400 401 402
401 402 403
3998 3999 4000
DR
400 1 0
401 1 0
402 1 0</p>
<p>
400 1 0
401 1 0
402 1 0</p>
<p>
401 1 0
402 1 0
403 1 0</p>
<p>
3998 1 0
3999 1 0
4000 1 0
NR
800145 800511 800876
800145 800511 800876
800511 800876 801241
2114288 2114653 2115018
CM
1 0 0
1 0 0
1 1 0
1 1 1
Y
400 400 402 4000
M
12 13 1 1
D
30 6 3 1
</pre>
</p>
<h3><a name='calfr∆rd2gr'><tt>calfr∆rd2gr</tt> - Conversion du <i lang='la'>Rata Die</i> vers le calendrier grégorien</a></h3>
<p>
Pour cette fonction, il y a deux possibilités. La première consiste à
convertir le <i lang='la'>Rata Die</i> en grégorien décalé, puis le
grégorien décalé en grégorien. Ou alors, convertir directement en
grégorien en utilisant deux fois le mécanisme de plage
de valeurs possibles utilisé dans <a href='#calfr∆rd2fr'>calfr∆rd2fr</a>, une première
fois pour calculer l'année, la seconde fois pour calculer le mois.
C'est cette deuxième possibilité que j'ai choisie.</p>
<p>
Le calcul de la borne supérieure et de la borne inférieure de la plage de
mois nécessite une division par 29,5 et une division par 31. Du coup,
l'estimation du mois est beaucoup moins précise que l'estimation
de l'année. La plage aura donc trois valeurs dès que le nombre de jours
vaut 620. Or, on sait que le nombre de jours ne dépassera pas 366 et
que le numéro du mois ne dépassera pas 12. Dans ces conditions,
la plage aura au maximum deux valeurs. Donc on ne s'embête pas, on prend
toujours une plage à deux valeurs pour calculer le mois, même si l'estimation
avait donné une plage à une seule valeur.
</p>
<pre>
∇ R ← calfr∆rd2gr N; ⎕IO; YH; YL; YI; YR; DR; NR; CM; Y; M; D; ML; MR
⎕IO ← 1
YH ← ⌈ N ÷ 365.24
YL ← ⌈ N ÷ 365.25
YI ← 0 , ⍳ ⌈/,YH-YL
YR ← YL ∘.+ YI
DR ← <a href='#calfr∆zerojanvnd' class='call'>calfr∆zerojanvnd</a> YR
NR ← <a href='#calfr∆gr2rd' class='call'>calfr∆gr2rd</a> DR
CM ← NR < N ∘.+ (⍴YI)⍴0
Y ← ⌈/YR×CM
D ← N - ⌈/NR×CM
ML ← ⌈D÷31
MR ← ML ∘.+ 0 1
DR ← (Y ∘.× 2 3 ⍴ 1 0 0) + (MR ∘.× 0 1 0)
NR ← <a href='#calfr∆gr2rd' class='call'>calfr∆gr2rd</a> DR
CM ← NR < N ∘.+ 0 0
M ← ⌈/MR×CM
D ← N - ⌈/NR×CM
R ← (Y ∘.× 1 0 0) + (M ∘.× 0 1 0) + D ∘.× 0 0 1
∇
</pre>
<h2><a name='Les fonctions de conversion'>Les fonctions de conversion</a></h2>
<h3><a name='calfr∆gr2fr'><tt>calfr∆gr2fr</tt> - Conversion du calendrier grégorien vers le calendrier républicain</a></h3>
<p>
Après tous ces calculs compliqués, la fonction de conversion est simplissime,
un peu décevante.
</p>
<pre>
∇ R ← calfr∆gr2fr D
R ← <a href='#calfr∆rd2fr' class='call'>calfr∆rd2fr</a> <a href='#calfr∆gr2rd' class='call'>calfr∆gr2rd</a> D
∇
</pre>
<h3><a name='calfr∆fr2gr'><tt>calfr∆fr2gr</tt> - Conversion du calendrier républicain vers le calendrier grégorien</a></h3>
<p>
Idem pour l'autre fonction de conversion.
</p>
<pre>
∇ R ← calfr∆fr2gr D
R ← <a href='#calfr∆rd2gr' class='call'>calfr∆rd2gr</a> <a href='#calfr∆fr2rd' class='call'>calfr∆fr2rd</a> D
∇
</pre>
<h2><a name='Affichage des dates'>Affichage des dates</a></h2>
<h3><a name='calfr∆prtfr'><tt>calfr∆prtfr</tt> - Affichage d'une date du calendrier républicain</a></h3>
<p>
Rassembler les éléments de la date : nom du jour, numéro, nom du mois, etc,
ne pose pas de problème. Ce qui en pose, c'est le fait que le résultat comporte
des espaces superflus et qu'il faut les éliminer tout en conservant les espaces
nécessaires.
</p>
<pre>
∇ R ← calfr∆prtfr D; DAY; MONTH; CM; ⎕IO
⎕IO ← 1
DAY ← 10 8 ⍴ 'Décadi Primidi Duodi Tridi QuartidiQuintidiSextidi Septidi Octidi Nonidi '
R ← DAY[1 + 10 | <a href='#calfr∆day' class='call'>calfr∆day</a> D;]
MONTH ← 13 11 ⍴ 'VendémiaireBrumaire Frimaire Nivôse Pluviôse Ventôse Germinal Floréal Prairial Messidor Thermidor Fructidor jour compl.'
R ← R, ' ', (⍕ <a href='#calfr∆day' class='call'>calfr∆day</a> D), ' ', (MONTH[<a href='#calfr∆month' class='call'>calfr∆month</a> D;]), ' ', (<a href='#calfr∆roman' class='call'>calfr∆roman</a> <a href='#calfr∆year' class='call'>calfr∆year</a> D), ', jour ', <a href='#calfr∆feasts' class='call'>calfr∆feasts</a>[¯30 + D +.× 0 30 1;]
CM ← ' ' ≠ R
R ← (CM ∨ 0,¯1↓CM) / R
R ← (⌽∨\⌽R≠' ')/R
∇
</pre>
<h3><a name='calfr∆roman'><tt>calfr∆roman</tt> - Conversion d'un nombre en chiffres romains</a></h3>
<p>
Si le nombre dépasse 3999, il conserve son expression en chiffres indo-arabes.
Idem s'il est négatif ou nul.
</p>
<pre>
∇ R ← calfr∆roman N; NODES
→ ((N>0) ∧ N<4000)/CONV
R ← ⍕ N
→ 0
CONV:
NODES ← 40 4 ⍴ (<a href='#calfr∆nodes' class='call'>calfr∆nodes</a> 'IVX'), (<a href='#calfr∆nodes' class='call'>calfr∆nodes</a> 'XLC'), (<a href='#calfr∆nodes' class='call'>calfr∆nodes</a> 'CDM'), <a href='#calfr∆nodes' class='call'>calfr∆nodes</a> 'M??'
R ← ,NODES[⎕IO + 30 20 10 0 + 10 10 10 10 ⊤ N;]
R ← (R≠' ')/R
∇
</pre>
<h3><a name='calfr∆nodes'><tt>calfr∆nodes</tt> - Construction des nœuds de la numération romaine</a></h3>
<p>
Le terme « nœuds » provient de <cite>Histoire comparée des numérations écrites</cite>
par Geneviève Guitel et je l'ai traduit en « nodes ». Dans une numération de base <var>b</var>, un nœud est un nombre
de la forme <var>k × b<sup>n</sup></var>, avec <var>k</var> entre 0 et <var>b</var> - 1.
Cette fonction participe à la construction d'une chaîne de caractères comportant 10
nœuds de la base 10 écrit en chiffres romains. Chaque nœud est complété par des espaces pour avoir une
longueur de 4.
</p>
<pre>
∇ R ← calfr∆nodes CH
R ← (' ', CH) [ ' IVX' ⍳ ' I II III IV V VI VII VIIIIX ' ]
∇
</pre>
<h3><a name='calfr∆feasts'><tt>calfr∆feasts</tt> - Fêtes du calendrier républicain</a></h3>
<p>
Cette fonction énumère les fêtes des 366 jours du calendier républicain.
</p>
<pre>
∇ R ← calfr∆feasts; V
⍝ include here the contents of feasts
∇
</pre>
<p>
Elle renvoie un tableau de 366 lignes de 21 caractères, une ligne par jour.
</p>
<pre>
4 21↑calfr∆feasts
du Raisin
du Safran
de la Châtaigne
de la Colchique
</pre>
<h2><a name='Tests internes'>Tests internes</a></h2>
<h3><a name='calfr∆testdata'><tt>calfr∆testdata</tt> - Données pour les tests</a></h3>
<p>
Cette fonction renvoie un tableau de <var>n</var> lignes et 7 colonnes,
contenant les données pour tester les fonctions de conversion.
Chaque ligne contient la date grégorienne, au format AAAA MM JJ,
la date républicaine au format AAAA MM JJ et la valeur <i lang='la'>Rata Die</i>.
Exemple :
</p>
<pre>
2 7↑calfr∆testdata
1792 9 22 1 1 1 654415
1793 10 23 2 2 2 654811
</pre>
<p>
Les premières lignes montrent que le 22 septembre 1792 correspond au 1<sup>er</sup> Vendémiaire I
avec une valeur <i lang='la'>Rata Die</i> 654415. De même, le 23 octobre 1973 correspond au
2 Brumaire II, <i lang='la'>Rata Die</i> 654811.</p>
<p>
Les valeurs adoptées sont les valeurs utilisées dans les tests de
<a href='https://metacpan.org/pod/DateTime::Calendar::FrenchRevolutionary'>DateTime::Calendar::FrenchRevolutionary</a>.
Le programme qui les formatte avec la syntaxe APL est disponible sur
<a href='https://github.com/jforget/French-Revolution-calendar-utilities'>GitHub</a>.
Et un utilitaire (en Perl) est fourni dans le présent projet pour insérer les valeurs dans le script final.
</p>
<pre>
∇ R ← calfr∆testdata; V; L
⍝ include here the contents of testapl
L ← (⍴ V) ÷ 7
R ← (L, 7) ⍴ V
∇
</pre>
<h3><a name='calfr∆teststring'><tt>calfr∆teststring</tt> - Données alphanumériques de tests</a></h3>
<p>
Cette fonction donne pour chaque ligne de <a href='#calfr∆testdata'><tt>calfr∆testdata</tt></a>
le résultat attendu de la fonction <a href='#calfr∆prtfr'><tt>calfr∆prtfr</tt></a>.
Par exemple :
</p>
<pre>
2 52↑calfr∆teststring
Primidi 1 Vendémiaire I, jour du Raisin
Duodi 2 Brumaire II, jour du Céleri
</pre>
<p>
L'origine des données et l'utilitaire pour les insérer dans le script
sont les mêmes que pour <a href='#calfr∆testdata'><tt>calfr∆testdata</tt></a>.
</p>
<pre>
∇ R ← calfr∆teststring; V; L
V ← ''
⍝ include here the contents of testapl1
∇
</pre>
<h3><a name='calfr∆alltests'><tt>calfr∆alltests</tt> - Lancement de tous les tests</a></h3>
<pre>
∇ calfr∆alltests
<a href='#calfr∆testfr2rd' class='call'>calfr∆testfr2rd</a>
<a href='#calfr∆testgr2rd' class='call'>calfr∆testgr2rd</a>
<a href='#calfr∆testrd2fr' class='call'>calfr∆testrd2fr</a>
<a href='#calfr∆testrd2gr' class='call'>calfr∆testrd2gr</a>
<a href='#calfr∆testgr2fr' class='call'>calfr∆testgr2fr</a>
<a href='#calfr∆testfr2gr' class='call'>calfr∆testfr2gr</a>
<a href='#calfr∆testprtfr' class='call'>calfr∆testprtfr</a>
∇
</pre>