Идентификаторы и привязка в схеме - как интерпретировать функцию? - PullRequest
1 голос
/ 25 октября 2010

Я читаю документ DrRacket http://docs.racket -lang.org / guide / binding.html

Есть функция

  (define f
    (lambda (append)
      (define cons (append "ugly" "confusing"))
      (let ([append 'this-was])
        (list append cons))))
  > (f list)
  '(this-was ("ugly" "confusing"))

Я вижу, что мыопределить функцию f, внутри мы определяем лямбда, которая принимает (добавить), почему?Процедура (тело) для лямбды - это еще одна функция с именем cons, которая добавляет две строки.

Я вообще не понимаю эту функцию.Спасибо!

Ответы [ 2 ]

5 голосов
/ 25 октября 2010

Раздел, на который вы ссылаетесь, демонстрирует лексическую область действия в Racket. Как и в других реализациях Схемы, основной момент заключается в том, что вы можете «затенять» каждую привязку в языке. В отличие от большинства «основных» языков, нет реальных «священных» ключевых слов в том смысле, что они никогда не могут быть скрыты локальной привязкой.

Обратите внимание, что действительно хорошим инструментом для визуализации того, что связано, является кнопка DrRacket «проверить синтаксис»: нажмите на нее, и вы увидите свой код с выделениями, показывающими, какие части являются привязками, а какие - специальными формами - и если наведите курсор мыши на определенное имя, вы увидите стрелку, указывающую, откуда оно.

4 голосов
/ 25 октября 2010

Схема требует некоторого привыкания:)

  1. f назначается функция, возвращаемая lambda.
  2. lambda определяет функцию, которая принимает параметр (называемый append).
  3. (define cons (append "ugly" "confusing")) сама по себе не является функцией, но вызывает append с двумя строками в качестве параметра и присваивает результат cons.
  4. внутри блока let добавлению присваивается другое значение, символ this-was.
  5. блок let создает список append (который теперь содержит 'this-was) и cons (который содержит '("ugly" "confusing") из 3 выше
  6. , поскольку 5 является последним утверждением, что значение возвращается всей функцией, которая называется f
  7. f вызывается с параметром list (функция list). который передается как параметр append. И именно поэтому 3 выше создает список '("ugly" "confusing"), которому присваивается cons.

Надеюсь, это немного прояснило ситуацию. Ура!

...