Вопрос об определении синтаксиса - PullRequest
1 голос
/ 05 декабря 2009

Я новичок в программировании, пробираюсь через SICP и люблю его. Хотя я немного озадачен синтаксисом определения схемы, главным образом, в чем разница между:

(define foo bar)

и

(define (foo) bar)

Первый просто назначает bar для foo и выполняет его? Пока второй назначает и ждет звонка?

Если да, как бы вы вызвали функцию внутри другой функции, скажем, в операторе if,

(if (foo) ...)

или

(if foo ...)

Ответы [ 2 ]

7 голосов
/ 05 декабря 2009

Первая версия создает переменную с именем foo и присваивает ей ссылку на bar. Больше ничего не исполняется.

Вторая версия создает функцию с панелью тела. Функция не выполняется, она хранится в файле (угадайте, что вы подразумеваете под «ожиданием»?).

Вы всегда вызываете функцию, делая ее первым элементом в списке и оценивая список.

создать переменную

> (define a 1)
> a
1

создать другую переменную, ссылающуюся на другую переменную

> (define b a)
> b
1

создать функцию, которая возвращает все, что есть в

> (define (c) a)
> c
#<procedure:c>

оценить функцию

> (c)
1

написать функцию, которая оценивает другую функцию и возвращает результат

> (define (d) (if (odd? a) (c) 0))
> (d)
1

теперь измените его, чтобы вернуть функцию c

> (define (d) (if (odd? a) c 0))
> (d)
#<procedure:c>
3 голосов
/ 05 декабря 2009

Вторая версия создает функцию (без параметров), эквивалентную

(define foo (lambda () bar))

Чтобы назвать это, это было бы (foo)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...