I have a working program in Common Lisp and I am trying to make it work in Scheme as well, but it is not working. The code is about depth-first search in the estructure called vecinos
Lisp Code:
(setq vecinos '((a . (b c d))
(b . (a h))
(c . (a g))
(d . (g))
(g . (c d k))
(h . (b))
(g . (k)) ) )
( cdr (assoc 'a vecinos))
( cdr (assoc 'b vecinos))
(defmacro get.value (X vecinos) `(cdr (assoc, X, vecinos)))
(defun extiende (trayectoria)
(mapcar #'(lambda (nuevo-nodo) (append trayectoria (list nuevo-nodo)))
(remove-if #'(lambda (vecino) (member vecino trayectoria))
(get.value (car (last trayectoria)) vecinos))))
(defun primero-en-profundidad (inicial final)
(primero-en-profundidad-aux inicial final (list (list inicial))))
(defun primero-en-profundidad-aux (inicial final abierta)
(cond ((eq inicial final)
(print (list inicial)))
((member (list inicial final) (extiende (list inicial)))
(print (list inicial final)))
((member final (first abierta))
(print (first abierta)))
(t (primero-en-profundidad-aux inicial final (append (extiende (first abierta)) (rest abierta))))
))
(primero-en-profundidad 'a 'a)
(primero-en-profundidad 'a 'k)
Scheme code:
#lang scheme
(define vecinos '((a . (b c d))
(b . (a h))
(c . (a g))
(d . (g))
(g . (c d k))
(h . (b))
(g . (k)) ) )
(define (get-value X vecinos)
(cond ((eq? (assoc X vecinos) #f) null)
(#t (cdr (assq X vecinos)) ) ))
And I think this is what is wrong because in Scheme there is no remove-if that is used in the definition of extiende
(define (extiende trayectoria)
(map car (lambda (nuevo-nodo) (append trayectoria (list nuevo-nodo)))
(remove-if (lambda (vecino) (member vecino trayectoria))
(get-value (car (last trayectoria)) vecinos))))
(define (primero-en-profundidad inicial final)
(primero-en-profundidad-aux inicial final (list (list inicial))))
(define (primero-en-profundidad-aux inicial final abierta)
(cond ((eqv? inicial final)
(print (list inicial)))
((member (list inicial final) (extiende (list inicial)))
(print (list inicial final)))
((member final (first abierta))
(print (first abierta)))
(#t (primero-en-profundidad-aux inicial final (append (extiende (first abierta)) (rest abierta))))
))
The result should be
(primero-en-profundidad '(a) '(a))
(A)
(primero-en-profundidad '(a) '(k))
(A C G K)