Estoy definiendo una función replaceOccurrence que reemplaza la primera aparición de cualquiera de los dos símbolos. No entiendo por qué la variable de lista no está vinculada Chez Scheme Versión 9.5

(define replaceOcurrence
  (λ (new ocurrence1 ocurrence2 lista)
    (cond
     ((null? lista) '())
     (else (cond
            ((eq? ocurrence1 (car lista))
             (cons new (cdr (lista))))
            ((eq? ocurrence2 (car lista))
             (cons new (cdr (lista))))
            (else (cons (car lista)
                    (replaceOcurrence new ocurrence1 ocurrence2 (cdr lista)))))))))
Exception: variable lista is not bound
-1
Alfredo Soto 22 ago. 2020 a las 21:38

1 respuesta

La mejor respuesta

Chez Scheme no admite λ como reemplazo de lambda. Racket lo hace, y lo dice explícitamente en la documentación. Guile parece ser compatible con λ también, pero no veo eso documentado. Dado que λ no se reconoce como una forma especial en Chez Scheme, los argumentos de λ se evalúan primero y, dado que aún no se han vinculado, se emite el error informado.

Hay otro problema en el código OP: lista está solo entre paréntesis dos veces; esto intenta llamar a lista como un procedimiento cada vez. Además, ocurrencia se escribe con dos C; y prefiere kebab-case a camelCase en Scheme. Aquí está el código fijo:

(define replace-occurrence
  (lambda (new occurrence1 occurrence2 lista)
    (cond
     ((null? lista) '())
     (else
      (cond
       ((eq? occurrence1 (car lista))
        (cons new (cdr lista)))
       ((eq? occurrence2 (car lista))
        (cons new (cdr lista)))
       (else
        (cons (car lista)
              (replace-occurrence new occurrence1 occurrence2 (cdr lista)))))))))

La mejor y más portátil forma de resolver el problema de OP es simplemente usar lambda. Pero, si uno realmente quiere usar λ, se puede usar una macro para proporcionar la sintaxis necesaria:

(define-syntax λ
  (syntax-rules ()
    [(_ formals . body)
     (lambda formals . body)]))

Con la inclusión de la macro anterior (y los otros cambios necesarios mencionados en la primera parte de la respuesta), el código OP puede usar λ en lugar de lambda.

3
ad absurdum 22 ago. 2020 a las 22:19