Вопрос о синтаксисе определения

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

(define foo bar)

и:

(define (foo) bar)

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

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

(if (foo) ...)

or

(if foo ...)

person Ammar Alammar    schedule 05.12.2009    source источник


Ответы (2)


Первая версия создает переменную с именем 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>
person Nathan Hughes    schedule 05.12.2009

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

(define foo (lambda () bar))

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

person Jeffrey Aylesworth    schedule 05.12.2009