J'essaie d'analyser une région "récapitulative" d'un ensemble de rapports d'ordinateur, où les noms de rapports et leurs variables associées changent de fichier en fichier. Je donne un composé exemple suivant le format ci-dessous:TXR: Analyse des rapports récapitulatifs contenant unicode avec une syntaxe plus compliquée à l'aide des fonctions
Summary Report
Bath Tub
Temperature: 30 °C
Water ready
volume: 200000 cm³
Bath Room
Floor Area: 40 ft²
Door Height: 9 ± 0.1 ft
Full Report Set
Il est difficile de voir de ce qui précède que l'espace blanc ressemble, alors voici une capture d'écran de mon éditeur de texte avec un espace blanc visible.
la région d'intérêt commence par Summary Report
et se termine par Full Report Set
. Les propriétés peuvent potentiellement s'étendre sur deux lignes. Les noms de propriété sont alignés de telle sorte que les deux-points :
restent à la même position de caractère dans chaque sous-rapport. A partir de la sortie de diagnostic, il semble que ma tentative d'exploiter ce fait ne fonctionne pas.
TXR: (src/generic-Micromeritics-report.txr: 36) non-concordance chr (position 11 par rapport à k) TXR: (src/generic-Micromeritics-report.txr: 36) de liaison non-concordance variable k (13 vs. 12) txr: (src/generic-micrometrics-report.txr: 36) incompatibilité chr (position 12 vs k) txr: (src/generic-micrometrics-report.txr: 36) chaîne appariée, position 13-18 (data/dummy-generic-report.txt: 6) txr: (src/generic-micrometrics-report.txr: 36) Température: 30 ° C
txr: (src/generic-micrometrics-report .txr: 36)^^ txr: (src/generic-micrometrics-report.txr: 23) spec épuisé de données txr: (emplacement source n/a) fonction (capture (néant (k. 13) (rapport "Baignoire"))) a échoué
J'ai inclus le code ci-dessous. Pouvez-vous expliquer pourquoi ce code ne fonctionne pas? Est-ce que je fais ce que je pense faire avec la fonction colon_position? Si oui, pourquoi échoue-t-il? Comment écririez-vous la fonction capture
? Est-ce l'approche générale que vous adopteriez? Y a-t-il un meilleur moyen? Merci beaucoup pour votre aide et vos conseils.
@; This output format always starts with or ends with atleast 2 blank spaces.
@; Fully blank spaced lines follow each property value pair line.
@(define blank_spaces)
@/[ ]+/@(eol)
@(end)
@; All colons align at the same column position within the body of a report.
@; If that doesn't happen, that means there is nothing to capture,
@; which shouldn't happen.
@; This function should bind the appropriate position without updating
@; the line position.
@; Reports end when there is an empty line, so don't look past that.
@(define colon_position (column))
@(trailer)
@(gather :vars (column))
@(skip)@(chr column):@(skip)
@(until)
@(end)
@(end)
@; Capture values for a property. Values are always given on a single line.
@; If there is error information, it will be indicated by a ± character.#\x00B1
@(define capture (value error units))
@(cases)@[email protected]\ ±@\ @[email protected]\ @[email protected]/[ ]+/@(eol)@\
@(or)@[email protected]\ @[email protected]/[ ]+/@(eol)@(bind error "")@\
@(end)
@(end)
Summary Report
@(collect :vars (report property value error units))
@report
@(forget k)
@(colon_position k)
@(cases)
@[email protected](chr k): @(capture value error units)@(blank_spaces)
@(ord)
@; Properties can span two lines. I have not seen any that span more.
@[email protected](chr k) @(blank_spaces)
@[email protected](chr k): @(capture value error units)@(blank_spaces)
@(merge property property_head property_tail)
@(cat property " ")
@(end)
@(blank_spaces)
@(end)
Full Report Set
@(output)
report,property,value,error,units
@(repeat)
@report,@property,@value,@error,@units
@(end)
@(end)
Comment rendre les fonctions horizontales plus robustes? Y at-il un moyen de lancer des exceptions avec eux? – wdkrnls
@wdkrnls Oups, quelqu'un a-t-il oublié une version horizontale de '@ (throw)'? Cela peut être fait avec une expression '@ (do (throw' sym args ...)) 'Lisp comme une solution de contournement plus verbeuse. De plus '@ (assert ...)' peut être utilisé à la place de 'throw' dans certaines situations. – Kaz
Je l'ai corrigé maintenant, mais il manque encore des choses dans le domaine horizontal, comme try/catch et blocks. – Kaz