2009-12-05 2 views
1

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

(define foo bar) 

и:

(define (foo) bar) 

Является первым один раз присваивает строку с Foo и выполнить его? Пока второй назначает и ждет вызова?

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

(if (foo) ...) 

или

(if foo ...) 

ответ

7

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

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

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

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

> (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 

Теперь изменить его вернуть функцию с

> (define (d) (if (odd? a) c 0)) 
> (d) 
#<procedure:c> 
3

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

(define foo (lambda() bar)) 

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

+0

Спасибо за ваш быстрый ответ. –

Смежные вопросы