Как работает `let` в Scheme? - PullRequest
       1

Как работает `let` в Scheme?

6 голосов
/ 24 апреля 2011

Я использую let для создания временной переменной, а затем использую эту временную переменную в следующем операторе.Однако DrScheme пожаловался:

let: bad syntax (not an identifier and expression for a binding) in: temp

Это мой фрагмент кода:

(define (case-one-helper str)
  (let (temp (substring str (+ 3 (string-contains str "my"))))
    (substring temp (string-contains temp " "))))

Интересно, нужно ли знать значение переменной, созданной let, во время компиляции?

Редактировать Я только что понял, пропустил ().

Спасибо,

Ответы [ 2 ]

12 голосов
/ 24 апреля 2011

Хотя это не совсем та проблема, с которой вы сталкиваетесь, но, кроме того, основываясь на вашем вопросе о последовательности оценки аргументов, let также является «синтаксическим сахаром» для лямбды, за которой следуют ее аргументы, которые сначала оцениваются, а затемпередается в лямбду, которая затем оценивается.

Например:

(let ((a (list 1 2 3))
      (b (list 4 5 6)))
     (cons a b))

- это то же самое, что и

((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6))

Итак, если вам интересноПоследовательность оценки, аргументы полностью оцениваются перед вычислением тела (и один аргумент не может ссылаться на предшествующий ему аргумент ... используйте let* для чего-то, что требует таких привязок).

4 голосов
/ 24 апреля 2011

Вам нужно поставить еще один набор скобок вокруг ваших let объявлений:

(define (case-one-helper str)
  (let ((temp (substring str (+ 3 (string-contains str "my")))))
    (substring temp (string-contains temp " "))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...