Skip to content

Latest commit

 

History

History
110 lines (65 loc) · 6.15 KB

File metadata and controls

110 lines (65 loc) · 6.15 KB

Отправка сообщений и страндартный Out

Скажем Привет

"Person waiving hello"

По старой традиции научимся вначале здороваться на новом языке программирования. Напишем на экране фразу "Hello World". Вот элементарный код на ро, который отображает некий текст.

hello.rho

Упражнение

Напишите программу, которая выводит на экран "Ро рулит!" вместо "Hello World".

Упражнение

Попробуйте заменить "stdout" на что-либо ещё. Какие результаты вы получили?

  • попробуйте использовать другое имя канала, например @"someChannel".
  • обойдемся без лишних церемоний. Давайте скажем "Здоров, а-р-р-чейн!".

Что такое stdout?

Channels are like mailboxes for sending messages

Программирование на ро построено вокруг взаимодействия на каналах. Каналы - это линии коммуникации, по которым можно отправлять и получать сообщения. Для отправки сообщения по каналу используется символ !.

Redo this diagram! friend -- имя канала ! -- символ отправки "Hey There" -- тело сообщения в круглых скобках

stdout -- специальный канал, который передаёт данные на стандартный поток вывода. В большинстве случаев это выводит их на экран. Так как это специальный канал, мы должны отдельно прописать его в первой строке.

Используем другие каналы

Sent messages wait to be received here in "message purgatory"... JK, it's called the "tuplespace"

Сообщения можно отправлять на любой канал, не только на stdout. Но в отличие от stdout такие сообщения не будут отображаться на экране.

tupleSpace.rho

Куда же тогда деваются сообщения, отправленные на другие каналы? Никуда! Сообщения просто лежат в хранилище (пространстве кортежей) и ждут, пока кто-то не получит или "поглотит" ("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 }

Делаем два дела сразу

Rather than following an ordered list, all ingredients are added concurrently.  Looks delicions

В ро мы не говорим компьютеру сделать одну операция, затем другую, а после - третью. Мы сообщаем все действия, которые нужно сделать, и он выполняет их одновременно, все сразу.

parallel.rho

Знак | читается как "параллельно" или просто "пар" для краткости.

Упражнение

Отправьте сообщение "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.")
}

В чем разница между stdout и stderr?