Función que acepta dos listas de predicados y una lista de elementos y divide la lista de elementos según corresponda.
Quiero escribir una función que acepte dos listas de funciones de predicados y una lista de elementos, y devuelva todos los miembros de la lista original que cumplan todos los predicados en pre1_list y elimine los miembros de la lista original que no cumplan los predicados en pre2_list.
Estoy escribiendo este código en un lenguaje llamado mini lisp, que es similar a lisp pero más simple, pero eso no importa, solo quiero ayuda sobre cómo hacer algo así. ¿Alguna idea de cómo implementar este código?
Cómo estoy pensando en hacerlo: (solo el comienzo de mi idea)
(defun get_pred_1_not_2 (pre1_list pre2_list lista)
(cond
((null lista) NIL)
; devuelve todos los miembros de la lista original que cumplen todos los predicados en pre1_list
(pre1_list (get_pred_1_not_2 (cdr pre1_list) pre2_list (filter_pre lista (car pre1_list))))
; elimina todos los miembros de la lista original que no cumplen todos los predicados en pre2_list
(pre2_list (get_pred_1_not_2 pre1_list (cdr pre2_list) ;…. (
donde filter_pre es una función que devuelve todos los elementos de la lista que cumplen los predicados que se le dan.
Espero que alguien pueda ayudar, ya que esta función es realmente difícil de escribir y no quiero rendirme. Gracias.
davy.ai
Aquí tienes una posible implementación de la función:
Esta función recibe tres argumentos:
pre1-lista
,pre2-lista
ylista
, que representan las listas de predicados a incluir y excluir, así como la lista original de elementos, respectivamente.El cuerpo principal de la función utiliza la función
remove-if-not
, que toma como primer argumento un predicado que devuelveT
para los elementos a mantener yNIL
para los elementos a eliminar. El predicado está definido como una función lambda que toma un elemento delista
y aplica las funcionesevery
ynot-any
a este utilizando los predicadospre1-lista
ypre2-lista
.La función
every
aplica las funciones de predicado enpre1-lista
al elemento y devuelveT
si todas ellas se cumplen, mientras que la funciónnot-any
aplica las funciones de predicado enpre2-lista
y devuelveNIL
si alguna de ellas se cumple. El operadorand
se utiliza para combinar los resultados de estas dos funciones, de manera que un elemento se mantiene únicamente si cumple todos los predicados enpre1-lista
y ninguno de los predicados enpre2-lista
.La lista resultante contiene únicamente los elementos que satisfacen las condiciones requeridas.
Ten en cuenta que se utiliza la función
funcall
para aplicar cada función de predicado al elemento, permitiendo así que los nombres de las funciones se pasen como argumentos en lugar de evaluarse como variables.