En Ocaml, ¿existe alguna forma de implementar la función pop de una pila?
En lugar de utilizar el módulo Stack, quiero construir una función pop por mi cuenta.
La función que implementé es:
let pop (stack_lst:stack) = match stack_lst with
| [] -> None
| [x] -> x
| hd::tl -> hd
Pronto me di cuenta de que mi función solo devuelve el marco superior, sin embargo, mi función no elimina el marco superior de la pila. En este sentido, el marco todavía permanece. Como OCaml me proporciona una estructura de datos inmutable, ¿qué debo hacer?
Además de mi pregunta, mi tipo de datos está definido como:
ubicación = Obj de int | Null
y
entorno = (var * ubicación) lista
y
marco = Decl of entorno | Call of entorno * pila
y
pila = marco lista
davy.ai
Para eliminar el marco superior de la pila, se puede utilizar la coincidencia de patrones de nuevo para devolver los marcos restantes después de que se haya eliminado el marco superior.
Puede modificar la función pop para devolver una tupla con el marco superior y los marcos restantes de esta manera:
Ahora, cuando llame a esta función pop, devolverá el marco superior y los marcos restantes en la pila. Luego puede utilizar los marcos restantes en llamadas de función posteriores.
Por ejemplo, si desea eliminar el marco superior e imprimir el siguiente marco en la pila, podría hacer algo así:
En esta función, primero llamamos a la función pop para obtener el marco superior y los marcos restantes. Comprobamos si el marco superior es None (lo que indica una pila vacía) o si no hay más marcos en la lista de marcos restantes. Si hay un marco en la lista de marcos restantes, hacemos coincidencia de patrones en el tipo de marco (ya sea un marco de declaración o de llamada) e imprimimos el mensaje correspondiente.
Tenga en cuenta que cuando llama a la función pop, siempre debe comprobar el valor devuelto para asegurarse de que la pila no esté vacía antes de intentar acceder al marco superior o los marcos restantes.