Что я делаю не так с этой оценкой Схемы? - PullRequest
0 голосов
/ 30 октября 2008

Оценка:

((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

Вот что я сделал:

  • оценка ((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

    • оценка 5 -> 5
  • оценка (((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4)

    • оценка 4 -> 4
  • оценка ((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3)

    • оценка 3 -> 3
  • (lambda (x) (lambda (y) (lambda (x) (+ x y)))) -> (lambda (x) (lambda (y) (lambda (x) (+ x y))))

  • применить (lambda (x) (lambda (y) (lambda (x) (+ x y)))) к 3

    • замена 3 -> x in (lambda (y) (lambda (x) (+ x y))

    • (lambda (y) (lambda (x) (+ 3 y))

    • оценка (lambda (y) (lambda (x) (+ 3 y)) -> (lambda (y) (lambda (x) (+ 3 y))

    • apply (lambda (y) (lambda (x) (+ 3 y)) до 4

    • subsute 4 -> y in (lambda (y) (lambda (x) (+ 3 y))

    • (lambda (y) (+ 3 4))

    • оценка (lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • subsute 5 ->?

А потом я застрял.

Ответы [ 3 ]

2 голосов
/ 30 октября 2008

Я предлагаю вам разбить это на отдельные «определенные» процедуры.

(define part1 (lambda (y) (lambda (x) (+ x y)))) ; basically an adder
(define part2 (lambda (x) part1))  ; just return part1, x has no effect

Теперь звоните (((part2 3) 4) 5) => 9

1 голос
/ 30 октября 2008

Ваша первая замена неверна; x в (+ x y) ограничен самым внутренним lambda, а не внешним. Это означает, что результатом этой замены будет (lambda (y) (lambda (x) (+ x y))). 3 потеряно. (Возможно, вам следует поискать правила замещения и применять их шаг за шагом, чтобы лучше понять их.)

Независимо от этого, для завершения вы все равно можете применить (lambda (y) (7)) (или (lambda (y) (+ 4 x)), если исправите вышеприведенное) к 5, чтобы получить 7 (или (+ 4 5), что оценивается как 9).

1 голос
/ 30 октября 2008
-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y))
-(lambda (y) (lambda (x) (+ 3 y))

Во-первых, это неправильно. Вы не заменяете 3 для всех случаев x, только для бесплатных. Заменяемый здесь x ограничен внутренним лямбда-выражением и поэтому не является свободным.

Во-вторых, нет ничего плохого в том, чтобы подставить значение для переменной, которая никогда не использовалась, поэтому замена 5 на y в (+ 3 4) - это нормально и дает (+ 3 4).

...