Usted escribió: "marcha atrás, coche, marcha atrás". Creo que quisiste escribir "reverse, cdr, reverse". No hay nada malo con esta solución; es lineal en el tamaño de la lista, al igual que cualquier solución a esto que use las listas estándar.
Como código:
;; all-but-last: return the list, not including the last element
;; list? -> list?
(define (all-but-last l) (reverse (cdr (reverse l))))
Si el recorrido múltiple de la lista o la construcción innecesaria de otra copia lista le molesta, que sin duda puede evitarlo, escribiendo directamente la cosa.
Dada tu casi solución, voy a suponer que esto no es tarea.
Esto es lo que se vería así, en la raqueta:
#lang racket
(require rackunit)
;; all-but-last : return the list, except for the last element
;; non-empty-list? -> list?
(define (all-but-last l)
(cond [(empty? l) (error 'all-but-last "empty list")]
[(empty? (rest l)) empty]
[else (cons (first l) (all-but-last (rest l)))]))
(check-equal? (all-but-last '(3 4 5))
'(3 4))
De hecho, una de las mejores cosas de Stackoverflow es que una vez que se publica una pregunta, se puede referenciar y desarrollar en otras publicaciones.SO es uno de los principales éxitos en Google cuando buscas cosas, por lo que si alguien se encuentra con esto en el futuro, puede aprender de lo que está aquí. :) – corsiKa
Para saber si Racket tiene una función inversa, use docs.racket-lang.org para buscarla. – soegaard