Procedimiento de scheme en una lista.
Imaginemos que tengo una lista ”(+ (* (x) (5)) (2)), ¿cómo podría hacer un procedimiento que cambie la x por cualquier parámetro que se dé y luego evalue la función dentro de la lista? ((calcular expresión x)).
Tuve algunas ideas pero no logré hacer que funcionaran. Estos son los helpprocedures que hice:
(define (atom? x)
(not (pair? x)))
(define (deep-map f l)
(cond
((null? l) ‘())
((atom? l) (f l))
(else
(cons (deep-map f (car l))
(deep-map f (cdr l))))))
(define (deep-change e1 e2 l)
(deep-map (lambda (x) (if (eq? x e1) e2 x)) l))
(define (go-through-list list)
(if (null? list)
‘()
((car lista) (go-through-list (cdr list)))))
Aquí está el código principal:
(define (calcular expresión x)
(let ((expressie (deep-change ‘x x expression)))
(( ‘+ (deep-change ‘+ (+) expression)))
(( ‘- (deep-change ‘- (-) expression)))
(( ‘* (deep-change ‘* (*) expression)))
(( ‘/ (deep-change ‘/ (/) expression)))
(go-through-list expression)))
Logré cambiar la x por el parámetro que doy pero tengo problemas con el * y el + dentro de la lista.
davy.ai
Para hacer un procedimiento que cambie la x por cualquier parámetro que le demos y luego evalúe la función dentro de la lista, podemos seguir los siguientes pasos:
Aquí está el código actualizado:
Ahora podemos probar con “(calcular ‘(+ (* (x) 5) 2) 3)” y obtener el resultado esperado “17”.