Введение в язык Scheme для школьников: различия между версиями
Содержимое удалено Содержимое добавлено
Ramir (обсуждение | вклад) мНет описания правки |
Ramir (обсуждение | вклад) мНет описания правки |
||
Строка 5:
== Введение в синтаксис==
*
*
*
Каждая законченная фраза на этом языке должна быть окружена парой круглых скобок.
Запишем сказанное выше на
<source lang=scheme>(+ 3 5)
(* 5 6 7)
(kupitj bulochnaja baton)</source>
Можно записать выражения и посложнее:
<source lang=scheme>(
Переменная задаётся следующей конструкцией языка:
Строка 24:
(define height 7)
(* 2 (+ width height))</source>
Прочитаем записанное по-русски:
Продолжим совершенствовать конструкции.
<source lang=scheme>(define a 3)
(define b 4)
(+ (* a a) (* b b))</source>
Что-то не так; мы обычно вместо «помножь переменную на саму себя» говорим «возведи в квадрат эту переменную», на Скиме — <code>square</code>:
<source lang=scheme>(+ (square a) (square b))</source>
«Сумма квадрата <var>a</var> и квадрата <var>b</var>.» Есть задача - есть её решение. Мы можем объявить новое слово-функцию, назвать её <code>square</code>. Функция будет принимать в качестве параметра число и возвращать его квадрат. Делается это следующим образом:▼
▲Есть задача - есть её решение. Мы можем объявить новое слово-функцию, назвать её square. Функция будет принимать в качестве параметра число и возвращать его квадрат. Делается это следующим образом:
<source lang=scheme>(define (square x) (* x x))</source>
Общий формат:
<source lang=scheme>(define (название параметр параметр...) тело функции)</source>
Функция возвращает последнее вычисленное значение. Это означает, что следующая функция square2:
<source lang=scheme>(define (square2 x) (
вернёт тот же результат, что и square,
Перепишем пример с суммой квадратов чисел заново:
<source lang=scheme>(define a 3)
Строка 45 ⟶ 44 :
(define (square x) (* x x))
(+ (square a) (square b))</source>
Нам не хватало слов в языке
Сразу пример. Пусть перед нами стоит задача сделать программу, которая спрашивает имя пользователя, а потом выводит ему приветствие.
;<code>read</code>:для чтения имени
;<code>display</code>:вывод чего-то на дисплее
;<code>newline</code>:вывод перевода строки
Мы бы хотели иметь такие
;<code>privet</code>:для приветствия с одним параметром - именем пользователя
;<code>polzovatel</code>:для получения имени пользователя, без параметров.
Строка 67:
(privet (polzovatel))</source>
[[w:Лисп|Лисп]] - полноценный функциональный язык, а поэтому функции - полноправные члены этого языка, независимо от того, определили вы их сами, или они уже были в языке
Например, функцию
<source lang=lisp>(define (abs x)
(if (positive? x )
Строка 74:
(- x)))</source>
<source lang=scheme>(define (abs x)
((if (positive? x) + -) x))</source>
<code>(if условие <действие, если условие выполняется> <действие в противном случае>)</code>
Строка 86:
;[http://www.plt-Scheme.org/ Plt Scheme] : одна из самых полных реализаций, включает в себя удобную обучающую среду Dr.Scheme. Есть версии для платформ [[w:Windows|Windows]], [[w:Linux|Linux]], [[w:Mac OS|Mac OS]].
;[http://www-sop.inria.fr/mimosa/fp/Bigloo/ Bigloo]: тоже достаточно полная реализация. Доступна для платформ [[w:Windows|Windows]], [[w:Linux|Linux]].
;[http://www.lispme.de/index.html LispMe]: версия для карманных компьютеров с операционной системой [[w:Palm OS|Palm OS]].
Строка 94 ⟶ 92 :
Все перечисленные реализации Scheme — это интерпретаторы. Запускаете интерпретатор — и можно вести с ним диалог на [[w:Scheme|Scheme]]: в ответ на его приглашение вводите конструкции на Scheme, а он будет возвращать результаты вычислений.
>1
1
Строка 102 ⟶ 100 :
>(+ a a)
6
>
Попробуйте «проиграть» все вышеперечисленные примеры. Думаю,
== Кто в мешке ==
Строка 109 ⟶ 107 :
=== Упражнение ===
Посмотрите следующие две реализации функции вычисления [[w:Факториал|факториала]] <math>f(n)=1 \cdot 2 \cdot \cdots \cdot n</math>. Одна из них основана на [[w:Рекурсия|рекурсии]], а другая – на [[w:Итерация|итерациях]]. Напишите на
==== Вариант 1 ====
Строка 126 ⟶ 124 :
==Повторение – мать учения==
Приведём небольшую шпаргалку по базовым конструкциям
Базовый синтаксис:
Строка 241 ⟶ 239 :
(+ c 1)</source>
А как бы нам сразу взять три числа и увеличить их на единицу одним махом? Для этого надо
<source lang=scheme>(list <элемент1> <элемент2> <элемент3> ...)</source>
Строка 254 ⟶ 252 :
<source lang=scheme>(map <функция> <список>)</source>
Эта функция возвращает список, в котором каждый элемент есть результат применения
<source lang=scheme>(define (inc x) (+ x 1)); увеличивает число на единицу
(map inc (list 1 1 1)); возвращает список из двоек
Строка 322 ⟶ 320 :
== См. также ==
* Викиучебник «[[Лисп]]»
* [[w:Лисп|Лисп]], статья в Википедии
* [[w:Scheme|Scheme]], статья в Википедии
|