'Ordenar por' Función para Rebol -- sorting campo con rebol camp codereview Relacionados El problema

'Sort By' Function for Rebol


4
vote

problema

Español

Estoy buscando una manera más de consisión de ordenar un bloque de objetos. Donde puede ordenar un bloque de bloques en función de la posición numérica de los valores para comparar, no hay tal taquigrafía para comparar objetos por un campo dado:

  test-data: reduce [     object [name: "A" value: 1]     object [name: "B" value: 3]     object [name: "C" value: 2] ]   

Una solución sería extender la función nativa 9988776665544331 para aceptar un argumento 9988777665544332 correspondiente al campo de objeto. Sin embargo, eso requeriría una actualización del idioma y podría tomar un poco de tiempo para ser aceptado.

He cortado el siguiente SORT-BY que tomaría una palabra (para el campo de objeto) o un bloque (una expresión que se aplica al objeto):

  sort-by: func [series [block!] comparator [block! word!]][     forskip series 2 [         insert series either word? comparator [             all [                 in series/1 :comparator                 get in series/1 :comparator             ]         ][             use [object] compose [                 object: first series                 (comparator)             ]         ]     ]      sort/skip series 2      head forall series [remove series] ]   

No es ideal: itera a través del bloque que tira del valor respectivo de cada objeto y agregándolo al bloque; ordena el bloque; y elimina el valor de nuevo.

  sort-by test-data 'value sort-by test-data 'name sort-by test-data [object/value] sort-by test-data [sine 50 * object/value]   

¿Alguna idea sobre el enfoque, en particular la economía? O incluso la necesidad de tal función ...

, obviamente, carece de un interruptor descendente / ascendente, implícito en la revisión futura.

Original en ingles

I'm looking for a more consise way to sort a block of objects. Where you can sort a block of blocks based on the numeric position of the values to compare, there's no such shorthand for comparing objects by a given field:

test-data: reduce [     object [name: "A" value: 1]     object [name: "B" value: 3]     object [name: "C" value: 2] ] 

One solution would be to extend the native SORT function to accept a WORD! argument corresponding to the object field. However, that would require an update to the language and might take a little while to be accepted.

I've sketched out the following SORT-BY function that would take either a word (for the object field) or a block (an expression that is applied to the object):

sort-by: func [series [block!] comparator [block! word!]][     forskip series 2 [         insert series either word? comparator [             all [                 in series/1 :comparator                 get in series/1 :comparator             ]         ][             use [object] compose [                 object: first series                 (comparator)             ]         ]     ]      sort/skip series 2      head forall series [remove series] ] 

It's not idealxe2x80x94it iterates through the block pulling the respective value from each object and adding it to the block; sorts the block; and removes the value again.

sort-by test-data 'value sort-by test-data 'name sort-by test-data [object/value] sort-by test-data [sine 50 * object/value] 

Any thoughts on the approach, particularly economy? Or even the need for such a function...

Obviously is lacking a descending/ascending switchxe2x80x94implied in future revision.

     
 
 

Lista de respuestas

3
 
vote

¿Alguna razón no puede usar el archivo s / strong> s / comparar aquí?

Aquí hay un ejemplo de trabajo de obj.__proto__ = ... statement0 que lo usa:

  obj.__proto__ = ... statement11  
 

Any reason you can't use the SORTs /COMPARE refinement here?

Here is a working example of sort-by that uses it:

sort-by: function [     series     [block!]     comparator [block! word!]   ][     sort/compare series func [`a `b] either word? comparator [         [`a/:comparator < `b/:comparator]     ][         sortie: function [by] [             s: to-paren copy/deep comparator             forall s [                 if all [path? s/1  s/1/1 = 'object] [s/1/1: by]             ]             s         ]          compose [(sortie '`a) < (sortie '`b)]     ] ] 
 
 
     
     

Relacionados problema

5  Función REBOL para clasificar los artículos en un bloque  ( Rebol function to categorize items in a block ) 
Tengo una función que itera a través de un bloque, prueba cada valor contra una función dada y se coloca en un bloque asociado con el producto de esa función....

8  Dialecto de cálculo de dados  ( Dice calculation dialect ) 
Como muestra de dialectos y enseñándome val = v[j]; v[j] = v[i-1]; v[i-1] = val4 Con val = v[j]; v[j] = v[i-1]; v[i-1] = val5 , escribí el siguiente dialec...

4  Expresando fechas de Rebol en EBNF  ( Expressing rebol dates in ebnf ) 
Estoy buscando definir el formato de fecha REBOL en la notación de EBNF. Me gustaría lo mejor posible para definir solo las fechas válidas , al menos aquellas...

8  Rebol View Disposición de diseño, busque notación mínima  ( Rebol view layout compose seek minima notation ) 
Estoy intentando derribar una vista de REBOL en un establecimiento de palabras de "dividir y conquide" de estilo ", para optimizar la legibilidad y la organiz...

27  Definición de devoluciones. Resuelto. Principalmente  ( Definitional returns solved mostly ) 
He realizado la afirmación audaz de que un problema de larga duración en Rebol está "ahora resuelto" ... la de "Devoluciones de definición" . Pero, por sup...

5  Expresando fechas de Rebol en BNF  ( Expressing rebol dates in bnf ) 
Estoy buscando definir el formato de fecha REBOL en la notación de BNF (como se ha adaptado para Rebol Parse). Me gustaría lo mejor posible para definir solo ...

8  Implementando diff simple en rebol  ( Implementing simple diff in rebol ) 
He tomado una grieta en la implementación de simple diff en rebol (versiones 2 y 3). La simple diferencia funciona al encontrar la secuencia común más larga...

4  Interfaz e implementación de este reemplazo para REBOL / ROJED REJOIN  ( Interface and implementation of this replacement for rebol red rejoin ) 
Este es un borrador de implementación de una función llamada Combine. No pretende ser un dialecto de formato complejo, solo un reemplazo para reincorporarse q...

8  Una implementación de la versión 4 UUID  ( A version 4 uuid implementation ) 
He estado jugando con la escritura de una aplicación descentralizada, P2P en Rebol 2, y una de las cosas que necesito hacer es generar un identificador univer...

3  Minimal Async Web Server en Rebol 2  ( Minimal async web server in rebol 2 ) 
Estoy construyendo un servidor web rudimentario en Rebol 2. Estoy intentando en particular a comprender el flujo y la lógica detrás de los aspectos asíncronos...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos