Использование define в условном выражении в Scheme - PullRequest
1 голос
/ 18 января 2020

В схеме общая форма определения процедуры :

(define (<<em> name > <<em> parameters >) <<em> body >)

где <<em> body > принимает последовательность выражений, разрешающую определения процедур такого типа:

> (define (f) 1 2 3)
> (f)
3

Аналогично, общая форма условного выражения имеет вид:

(cond (<<em> предикат > <<em> последовательный > ) (<<em> предикат > <<em> последовательный >)… (<<em> предикат > <<em> последовательный >))

где <<em> последовательный > в каждом предложении принимает последовательность выражений, допускающих условные выражения такого типа:

> (cond (#t 1 2 3))
3

Но почему я не могу использовать define в выражении условия условного выражения, например, в теле определения процедуры?

Сравните:

> (define (f) (define x 1) (define y 1) (define z 1) (+ x y z))
> (f)
3

с:

> (cond (#t (define x 1) (define y 1) (define z 1) (+ x y z)))
ERROR on line 1: unexpected define: (define x 1)

Примечание. - Я использую инструмент Chibi-Scheme 0.8.0 ion на MacOS 10.15.2.

1 Ответ

2 голосов
/ 18 января 2020

Как заметил @Barmar, определения не являются выражениями , но есть два контекста, где оба допускаются (см. Раздел 5.1. R 7 RS , выделение мое):

  • на самом внешнем уровне программы;
  • в начале тела.

Программа Scheme состоит из одного или нескольких объявлений импорта, за которыми следует последовательность выражений и определений. Объявления импорта указывают библиотеки, от которых зависит программа или библиотека; Подмножество идентификаторов, экспортируемых библиотеками, становятся доступными для программы. Выражения описаны в главе 4. Определения - это либо определения переменных, либо определения синтаксиса, либо определения типа записи, и все они объяснены в этой главе. Они действительны в некоторых, но не во всех контекстах, где допускаются выражения, особенно на самом внешнем уровне «программы» и в начале «тела».

Именно поэтому define допускается в теле определения процедуры, но не в условии, являющемся следствием предложения условного выражения, поскольку оно не является телом.

...