По старой традиции научимся вначале здороваться на новом языке программирования. Напишем на экране фразу "Hello World". Вот элементарный код на ро, который отображает некий текст.
Напишите программу, которая выводит на экран "Ро рулит!" вместо "Hello World".
Попробуйте заменить "stdout" на что-либо ещё. Какие результаты вы получили?
- попробуйте использовать другое имя канала, например
@"someChannel"
. - обойдемся без лишних церемоний. Давайте скажем
"Здоров, а-р-р-чейн!"
.
Программирование на ро построено вокруг взаимодействия на каналах. Каналы - это линии коммуникации, по которым можно отправлять и получать сообщения. Для отправки сообщения по каналу используется символ !
.
friend
-- имя канала
!
-- символ отправки
"Hey There"
-- тело сообщения в круглых скобках
stdout
-- специальный канал, который передаёт данные на стандартный поток вывода. В большинстве случаев это выводит их на экран. Так как это специальный канал, мы должны отдельно прописать его в первой строке.
Сообщения можно отправлять на любой канал, не только на stdout
. Но в отличие от stdout
такие сообщения не будут отображаться на экране.
Куда же тогда деваются сообщения, отправленные на другие каналы? Никуда! Сообщения просто лежат в хранилище (пространстве кортежей) и ждут, пока кто-то не получит или "поглотит" ("consume") их. Мы научимся поглощать сообщения в следующем уроке.
Убедимся, что сообщение всё еще находится в пространстве кортежей. (Помните, что если вы пользуетесь онлайн интерпретатором, то пространство кортежей обнуняется при каждом выполнении). Мы должны видеть нечто похожее на следующий код:
Storage Contents:
@{"RandoChannel"}!("This won't be on the screen") | for( x0, x1 <= @{Unforgeable(0x01)} ) { Nil } | for( x0, x1, x2, x3 <= @{"secp256k1Verify"} ) { Nil } | for( x0, x1 <= @{"sha256Hash"} ) { Nil } | for( x0, x1 <= @{Unforgeable(0x03)} ) { Nil } | for( x0, x1, x2, x3 <= @{"ed25519Verify"} ) { Nil } | for( x0, x1 <= @{"blake2b256Hash"} ) { Nil } | for( x0 <= @{Unforgeable(0x02)} ) { Nil } | for( x0 <= @{Unforgeable(0x00)} ) { Nil } | for( x0, x1 <= @{"keccak256Hash"} ) { Nil }
В ро мы не говорим компьютеру сделать одну операция, затем другую, а после - третью. Мы сообщаем все действия, которые нужно сделать, и он выполняет их одновременно, все сразу.
Знак |
читается как "параллельно" или просто "пар" для краткости.
Отправьте сообщение "1 большую с пепперони, пожалуйста" на канал с именем "Бургеры Боба".
Отправьте "Привет, мам" на канал "мамин телефон".
Выведите три сообщения: "Рик", "Морти" и "Снежок" на экран в одной программе. Выполните эту программу несколько раз, посмотрите, в каком порядке выводятся эти сообщения.
Что выведет на экран фраза stdout!("Programming!")
?
- Programming!
- stdout!
- Ничего
Какой канал посылает сообщение фраза @"what"!("Up")
?
-
@"Up"
-
@"what"
-
what
Что виртуальная машина ро сделает вначале, выполняя следующий код?
@"stdout"!("Dogs")
|
@"stdout"!("Cats")
- напечатает "Dogs"
- напечатает "Cats"
- Ни то, ни другое. Эти события произойдут одновременно и параллельно.
PS. Есть ещё один специальный канал stderr
. Посмотрите, что будет, если послать сообщение на него.
new stderr(`rho:io:stderr`) in {
stderr!("Danger! This is your Emperor speaking. There is danger here.")
}