Node:Creating a Procedure,
Next:Lambda Alternatives,
Previous:Simple Invocation,
Up:About Procedures
[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]
Scheme has lots of standard procedures, and Guile provides all of these via predefined top level variables. All of these standard procedures are documented in the later chapters of this reference manual.
В состав Scheme включено множество стандартных процедур. Все они так же входят в состав Guile. Эти процедуры определены как перменные верхнего уровня (top-level). Все они описаны в дальнейших главах руководства.
Before very long, though, you will want to create new procedures that
encapsulate aspects of your own applications' functionality.
To do this, you can use the famous lambda syntax.
Для создания процедур используется особая синтаксическая конструкция lambda.
For example, the value of the following Scheme expression
Например, следущее выражение Scheme
(lambda (name address) expression ...)
is a newly created procedure that takes two arguments:
name and address. The behaviour of the
new procedure is determined by the sequence of expressions in the
body of the procedure definition. (Typically, these
expressions would use the arguments in some way, or else there
wouldn't be any point in giving them to the procedure.) When invoked,
the new procedure returns a value that is the value of the last
expression in the procedure body.
это новая процедура, которая принимает два
аргумента: имя (name) и адрес (address). Поведение
процедуры определяется последовательностью выражений (expression) в
теле (body) определения. (Обычно эти выражения
должны использовать аргументы процедуры каким-либо образом,
иначе нет смысла передавать их в процедуру). После вызова новая процедура
возвращает значение, которое вычисляется последним выражением
в теле процедуры.
To make things more concrete, let's suppose that the two arguments are both strings, and that the purpose of this procedure is to form a combined string that includes these arguments. Then the full lambda expression might look like this:
Уточним ситуацию. Допустим, мы хотим сделать процедуру, которая
объединяет две строки в одну, так, что оба аргумента у процедуры должны быть строками.
Для этого lambda-выражение в полной форме должно выглядеть так:
(lambda (name address) (string-append "Name=" name ":Address=" address))
We noted in the previous subsection that the procedure part of a procedure invocation expression can be any Scheme expression whose value is a procedure. But that's exactly what a lambda expression is! So we can use a lambda expression directly in a procedure invocation, like this:
Мы отметили в предыдущей части, что объявление процедуры (procedure)
может быть любым выражением Scheme, значением которой является процедура. Но, ведь lambda-выражение
как раз и возвращает процедуру! Так что мы можем использовать lambda-выражение напрямую в
вызове процедуры, например, вот так:
((lambda (name address) (string-append "Name=" name ":Address=" address)) "FSF" "Cambridge")
This is a valid procedure invocation expression, and its result is the
string "Name=FSF:Address=Cambridge".
Это правильное выражение вызова процедуры, и его результат - строка
"Name=FSF:Address=Cambridge"
It is more common, though, to store the procedure value in a variable --
Тем не менее, обычно сохраняют процедурное значение в переменной:
(define make-combined-string
(lambda (name address)
(string-append "Name=" name ":Address=" address)))
-- and then to use the variable name in the procedure invocation:
и используют имя этой переменной для вызова процедуры:
(make-combined-string "FSF" "Cambridge")
Which has exactly the same result.
Что даёт абсолютно одинаковый результат.
It's important to note that procedures created using lambda have
exactly the same status as the standard built in Scheme procedures, and
can be invoked, passed around, and stored in variables in exactly the
same ways.
Нужно заметить, что процедуры, созданные с использованием lambda имеют
абсолютно такой же статус, как встроенные в Scheme процедуры и могут так же вызываться, передаваться
и сохраняться в переменных.
> > далее > >