Was sollte ich eine REBOL Funktion aufrufen, die Liste Comprehensions tut?
-
03-07-2019 - |
Frage
REBOL hat keine integrierte Möglichkeit Listenkomprehensionen auszuführen. Allerdings hat REBOL über eine leistungsfähige Einrichtung (bekannt als parse
), die verwendet werden können, domänenspezifische Sprachen (DSLs) zu erstellen. Ich habe parse
verwendet für Listenkomprehensionen einen solchen Mini-DSL zu erstellen. Um den Ausdruck zu interpretieren, wobei der Block das Verständnis enthält, wird an eine Funktion übergeben, die in Ermangelung eines besseren Begriffs ich comprehend
genannt habe.
Beispiel:
comprehend [(a * b) for a in 1x100 for b in 4x10 where (all [odd? a odd? b])]
Aus irgendeinem Grunde comprehend
klingt nicht richtig zu mir, aber so etwas wie eval
ist zu allgemein.
Ich habe keine andere Sprache gefunden, die ein Schlüsselwort oder eine Funktion für Listenkomprehensionen erfordert. Sie sind rein syntaktischer Zucker, wo immer sie existieren. Leider habe ich diese Option nicht. Also, da ich eine Funktion haben muss, was ein guter, prägnant, logischen Namen für das?
Lösung
Wie wäre es select
?
select [(a * b) for a in 1x100 for b in 4x10 where (all [odd? a odd? b])]
Andere Tipps
Da Listenkomprehensionen kann als analog betrachtet werden, kartieren Sie könnten denken, es ruft so etwas wie „Liste Karte“. Alternativ weil Listenkomprehensionen auf Set-Builder-Notation basieren, man könnte es etwas entlang der Linien von „build“ nennen oder „Buildlist“.
(Disclaimer: Ich weiß sehr wenig über REBOL, so verzeiht mir, wenn diese Namen bereits vergeben sind)
transmogrify
do
könnte angemessen sein, als Listenkomprehensionen nur eine Instanz von Monad Comprehensions ist, und do
ist das Schlüsselwort in Haskell für gezuckerte Monadic Berechnungen verwendet, aber ich vermute, es ist zu vage für eine Anwenderbibliothek. Ich rief meine Liste Verständnis Funktion comp
, aber das ist nur eine Abkürzung von dem, was Sie bereits haben. Vielleicht yielding
? Z.B. yielding [(a * b) for a in 1x100 for b in 4x10 where (all [odd? a odd? b])]
. Gerade Art von Schielen und so tun, als die [] ist nicht da.