Начните программировать на Racket, написав игру «Угадай число».
Racket — отличный способ выучить язык семейств Scheme и Lisp.
Я большой сторонник изучения нескольких языков программирования. В основном это потому, что мне наскучили языки, которые я использую чаще всего. Это также учит меня новым и интересным способам программирования.
Написание одной и той же программы на нескольких языках — хороший способ изучить их различия и сходства. Ранее я писал статьи, показывающие один и тот же пример программы построения графиков данных, написанной на C и C++, JavaScript с Node.js, а также Python и Octave.
Эта статья является частью другой серии статей о написании игры «Угадай число» на разных языках программирования. В этой игре компьютер выбирает число от одного до 100 и просит вас его угадать. Программа работает до тех пор, пока вы не сделаете правильное предположение.
Изучение нового языка
Связанный контент
Освоение нового языка всегда вызывает чувство неловкости — мне кажется, что я теряю время, поскольку было бы гораздо быстрее использовать инструменты, которые я знаю и использую постоянно. К счастью, вначале я с большим энтузиазмом изучаю что-то новое, и это помогает мне преодолеть первоначальную боль. И как только я узнаю новую точку зрения или решение, о котором никогда бы не подумал, все становится интересно! Изучение новых языков также помогает мне использовать новые методы в моих старых и проверенных инструментах.
Когда я начинаю изучать новый язык, я обычно ищу учебник, который знакомит меня с его синтаксисом. Как только я почувствую синтаксис, я начинаю работать над знакомой мне программой и ищу примеры, которые адаптируются к моим потребностям.
Что такое Рэкет?
Racket — это язык программирования семейства Scheme, который является диалектом Lisp. Лисп также представляет собой семейство языков, поэтому может быть сложно решить, с какого «диалекта» начинать, когда вы хотите изучать Лисп. Все реализации имеют разную степень совместимости, и такое множество опций может отпугнуть новичков. Я думаю, это очень жаль, потому что эти языки действительно веселые и стимулирующие!
Начать с Racket имеет смысл, потому что он очень зрелый и универсальный, а сообщество очень активное. Поскольку Racket — это язык, похожий на Lisp, его основной особенностью является то, что он использует префиксную нотацию и множество круглых скобок. Функции и операторы применяются к списку операндов путем добавления к ним префикса:
(function-name operand operand ...)
(+ 2 3)
↳ Returns 5
(list 1 2 3 5)
↳ Returns a list containing 1, 2, 3, and 5
(define x 1)
↳ Defines a variable called x with value of 1
(define (f x y) (* x x))
↳ Defines a function called f with two parameters called x and y that returns their product.
Это, по сути, все, что нужно знать о синтаксисе Racket; остальное — изучение функций из документации, которая очень тщательна. Существуют и другие аспекты синтаксиса, такие как аргументы ключевых слов и кавычки, но они вам не нужны для этого примера.
Освоить Racket может быть сложно, а его синтаксис может показаться странным (особенно если вы привыкли к таким языкам, как Python), но мне очень интересно его использовать. Большим бонусом является среда программирования Racket DrRacket, которая очень помогает, особенно когда вы только начинаете изучать язык.
Основные дистрибутивы Linux предлагают упакованные версии Racket, поэтому установка должна быть простой.
Игра «Угадай число» в Racket
Вот версия программы «угадай число», написанная на Racket:
#lang racket
(define (inquire-user number)
(display "Insert a number: ")
(define guess (string->number (read-line)))
(cond [(> number guess) (displayln "Too low") (inquire-user number)]
[(< number guess) (displayln "Too high") (inquire-user number)]
[else (displayln "Correct!")]))
(displayln "Guess a number between 1 and 100")
(inquire-user (random 1 101))
Сохраните этот листинг в файл с именем guess.rkt
и запустите его:
$ racket guess.rkt
Вот пример вывода:
Guess a number between 1 and 100
Insert a number: 90
Too high
Insert a number: 50
Too high
Insert a number: 20
Too high
Insert a number: 10
Too low
Insert a number: 12
Too low
Insert a number: 13
Too low
Insert a number: 14
Too low
Insert a number: 15
Correct!
Понимание программы
Я пройду программу построчно. В первой строке указывается язык, на котором написан листинг: #langracket
. Это может показаться странным, но Racket очень хорош в написании интерпретаторов для новых предметно-ориентированных языков. Однако не паникуйте! Вы можете использовать Racket как есть, потому что он очень богат инструментами.
Теперь о следующей строке. (define ...)
используется для объявления новых переменных или функций. Здесь определяется новая функция под названием inquire-user
, которая принимает параметр number
. Параметр number
— это случайное число, которое пользователь должен будет угадать. Остальная часть кода внутри круглых скобок процедуры define
представляет собой тело функции inquire-user
. Обратите внимание, что имя функции содержит тире; это идиоматический стиль Racket для написания длинных имен переменных.
Эта функция рекурсивно вызывает себя, повторяя вопрос, пока пользователь не угадает правильное число. Обратите внимание: я не использую циклы; Я чувствую, что программисты Racket не любят циклы и используют только рекурсивные функции. Этот подход является идиоматическим для Racket, но если вы предпочитаете, можно использовать циклы.
На первом этапе функция inquire-user
просит пользователя вставить число, записав эту строку в консоль. Затем он определяет переменную с именем guess
, которая содержит все, что ввел пользователь. Функция read-line
возвращает введенные пользователем данные в виде строки. Затем строка преобразуется в число с помощью функции string->number
. После определения переменной функция cond
принимает ряд условий. Если условие удовлетворено, он выполняет код внутри этого условия. За этими условиями, (> угадывание числа)
и (< угадывание числа)
, следуют две функции: displayln
, которая дает подсказки пользователю. и вызов inquire-user
. Функция вызывает себя снова, когда пользователь не угадывает правильное число. Предложение else
выполняется, когда два условия не выполняются, т. е. пользователь вводит правильное число. Внутренняя часть программы — это функция inquire-user
.
Однако функцию все равно нужно вызвать! Сначала программа просит пользователя угадать число от 1 до 100, а затем вызывает функцию inquire-user
со случайным числом. Случайное число генерируется с помощью функции random
. Вам нужно сообщить функции, что вы хотите сгенерировать число от 1 до 100, но функция random
генерирует целые числа до max-1
, поэтому я использовал 101.
Попробуйте ракетку
Изучать новые языки – это весело! Я большой сторонник полиглотизма в языках программирования, потому что он привносит в программирование новые интересные подходы и идеи. Racket — прекрасная возможность начать учиться программировать на языке, похожем на Lisp. Я предлагаю вам попробовать.