Этот пост в блоге начался, когда я хотел объединить две вещи, которые мне нравятся: поиграть с разными языками программирования и сварить свой собственный кофе из разных зерен со всего мира. Затем это заставило меня задуматься: как некоторые из самых интересных языков программирования, которые я использовал, связаны с некоторыми из самых вкусных и необычных бобов, которые мне довелось попробовать?

Имейте в виду, я не считаю себя экспертом ни в одном из двух. Однако сегодня я могу поделиться достаточными знаниями, чтобы вы узнали что-то новое! И, кто знает, может быть, вы будете достаточно вдохновлены, чтобы попробовать новый язык или сорт кофе.

Без лишних слов, сделайте себе кофе, присаживайтесь и наслаждайтесь моими парами кофе / язык программирования!

Ада и венесуэльский кофе: Совершенно великолепно - почти идеально - и невероятно сложно найти

Начну с того, что сразу начну: Ада - мой любимый язык программирования. И я родом из Венесуэлы. Так что здесь будет некоторая предвзятость. Однако я почти уверен, что любой, кто пробовал Аду, признает, что это чертовски сложный язык! Венесуэла всегда была хорошо известна своим восхитительным кофе и какао-бобами, так что, надеюсь, я все равно не слишком оторван от правды.

Что же тогда делает их такими замечательными? Когда дело доходит до Ada, нужно сначала понять, для чего он был создан: высоконадежные и безопасные системы. Это объясняет многие вещи, связанные с языком; очень строгая система типов, которая также невероятно выразительна, она обладает странным массивом и строковыми типами, которые заставляют вас всегда определять их размер, чтобы компилятор мог гарантировать отсутствие переполнения. Кроме того, его синтаксис, хотя поначалу казался многословным, очень хорошо подходит для удобочитаемости (что имеет большой смысл, учитывая, что мы тратим гораздо больше времени на чтение программного обеспечения, чем на его написание).

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

К сожалению, с самого начала он получил плохую репутацию из-за его отношений с Министерством обороны США и того, что он был закрытым языком с платным компилятором. В настоящее время вы можете скачать его бесплатную версию, но она пока еще не получила широкого распространения. Многие проблемы, которые вы обнаружите при разработке, будет не так просто решить, как поиск в Google или просмотр Stack Overflow.

Что касается венесуэльского кофе: если вы можете представить, каким должен быть хороший кофе на вкус, то вы почти поймете, почему он так высоко ценится. Из-за того, что в настоящее время страна находится в «хрупком» состоянии, его не так легко можно найти в обычных кофейнях. Так же, как и с Ada, если вы его получите, попробуйте. Вы не пожалеете!

with Ada.Text_IO; use Ada.Text_IO;
procedure Drinking_Venezuelan_Coffee is
    type Level_Type is range 0 .. 100;
    type Coffee_Origin_Type is (Venezuela, Kenya, Rwanda, Sumatra);
    type Coffee_Mug is record
        Level : Level_Type;
        Coffee_Origin : Coffee_Origin_Type;
    end record;
    procedure Fill_Mug (M : in out Coffee_Mug) is
    begin
        case M.Level is
            when 0 .. 99 => 
                M.Level := Level_Type'Last;
                Put_line ("Mug filled!");
            when others => 
                Put_Line ("Mug is already full!");
        end case;
    end Fill_Mug;
    My_Mug : Coffee_Mug := (Level => 0, Coffee_Origin => Venezuela);
begin
    Fill_Mug (My_Mug);
end Drinking_Venezuelan_Coffee;

Пони и кенийский кофе: простой и неприметный, но полный аромата

Что мне очень нравится в кенийском кофе, так это то, что это очень молотый кофе. Вы почти чувствуете вкус земли с каждым глотком. Если вы не понимаете, что я имею в виду, представьте себе удивительный запах земли перед дождем. Да, кенийский кофе такой вкусный!

Такое же чувство я испытываю всякий раз, когда что-то делаю с языком Пони. Pony - очень гостеприимный язык программирования, потому что он не пытается быть чем-то большим, чем он есть на самом деле. И все же то, что он может предложить, довольно мощное и уникальное. Для начала, Пони - это актерский язык. Если вы знакомы с Erlang или используете каналы, вы поймете его суть. Но если нет, подумайте о каждом акторе как о живом объекте (или процессе), который общается с другими акторами, отправляя и получая сообщения. Это уже делает Pony вполне подходящим для параллельных систем и программ, но есть кое-что еще: Pony - это также язык программирования, основанный на возможностях, в котором для всего есть набор правил, которые говорят вам, что вы можете, а что не можете с ним делать. Например, переменная с возможностью Value доступна только для чтения, что означает, что вы можете безопасно делиться ею между вашими актерами. Переменная с возможностью ссылки является изменяемой, что означает, что вы не можете передавать ее. Их, конечно, намного больше, но, надеюсь, вы поняли суть. Все это упаковано в красивый синтаксис, который напоминает мне Python, который всегда приятно читать.

Это звучало убедительно? Я надеюсь, что это так! А если вы решили попробовать Пони, попросите дружелюбного бариста приготовить вам к нему чашку кенийского кофе. Вы можете есть как хотите, но я рекомендую черный и без сахара.

actor Customer
  let name: String
  var _coffee: String = "" 
 
  new create(name': String) =>
    name = name'  
  be ask_for_coffee(b: Barista) =>
    b.prepare_coffee(this, name) 
 
  be receive_coffee (coffee': String) =>
    _coffee = coffee'
actor Barista
  let available_coffee: String
  let _out: OutStream
  new create(available_coffee': String, out: OutStream) =>
    available_coffee = available_coffee'
    _out = out
  be prepare_coffee(c: Customer, name: String) =>
    _out.print("One " + available_coffee + " coffee for " + name)
    c.receive_coffee(available_coffee)
actor Main
  new create(env: Env) =>
    var barista = Barista("Kenyan", env.out)
    var customer = Customer("Jane")    
    
    customer.ask_for_coffee(barista)

Reason и руандийский кофе: знакомые снаружи, удивительно захватывающие внутри

Если есть что-то общее, что объединяет Reason и руандийский кофе, так это то, что они оба на первый взгляд похожи на что-то другое. Когда дело доходит до руандийского кофе, он выглядит как любой другой кофе, но когда вы его пробуете ... тьфу, это не похоже на кофе, который вы когда-либо пробовали!

Что касается Reason, то с точки зрения синтаксиса он очень похож на JavaScript. Это происходит по уважительной причине (каламбур): это язык, в основном предназначенный для разработчиков JavaScript. Уменьшение «грамматического трения» - одна из его целей. Однако под этим первым поверхностным слоем знакомства скрывается во многих, многих отношениях другой язык.

Во-первых, Reason, в отличие от JavaScript, работает на OCaml. Можно сказать, что это слой синтаксиса поверх OCaml. По сути, это мощная и богатая система типов, о которой JavaScript мог только мечтать (я все еще люблю тебя, JavaScript, только не так!). С Reason вы сможете создавать более совершенное программное обеспечение, на которое будет проще положиться. В дополнение к этому вы можете компилировать как JavaScript, так и OCaml, что дает вам доступ сразу к двум очень зрелым экосистемам. Да, и если вам нужна еще одна причина (да, каламбур… снова), чтобы попробовать это, два слова: сопоставление с образцом. Думайте об этом как о своего рода операторе переключения, который позволяет вам сопоставить форму ваших данных, а не просто делать это с помощью явного значения. Поверьте, если вы воспользуетесь языком с сопоставлением с образцом, вы будете упускать его всякий раз, когда воспользуетесь языком, на котором нет!

Если вам хочется попробовать что-то новое, но не хочется уходить слишком далеко от своей зоны комфорта, будь то другие виды кофе или языки программирования с синтаксисом в стиле C, то, возможно, вам стоит подумать о том, чтобы попробовать Reason или руандийский кофе, вы можете не ошибетесь ни с одним!

let workingHours = 8;
let workStartsAt = 9;
let myPreferredDrink = "Rwandan coffee";
let translateTime = (hour) => 
  hour < 13 
  ? string_of_int(hour) ++ "AM" 
  : string_of_int(hour - 12) ++ "PM";
let whatToDo = (firstHour, currentHour, drink) => {
  let timeOfDay = firstHour + currentHour;
  let atTime = (predicate) => 
      "At " ++ translateTime(timeOfDay) ++ predicate ++ "!";
  switch (timeOfDay, timeOfDay mod 2) {
  | (_, 0) => atTime(" drink more " ++ drink) 
  | (13, _) => atTime(": Lunch break")
  | _ => atTime(" drink " ++ drink)
  };
};
for (hour in 0 to workingHours) {
  Js.log(whatToDo(workStartsAt, hour, myPreferredDrink))
};

Идрис и Суматранский кофе: странные, трудные для понимания и наполненные невероятной глубиной

Когда дело доходит до языков программирования, с которыми мне нравится играть, определенная группа так называемых функциональных языков программирования находится на вершине. Одним из самых популярных в этой группе является Haskell, от которого Идрис заимствует множество реплик.

Одним из основных клиентов функционального языка программирования является то, что функции - это первоклассные граждане. Вы можете обращаться с ними, как с любыми другими значениями, что позволяет делать довольно мощные вещи, например, возвращать функции или передавать их в качестве аргументов другим функциям. Они также имеют тенденцию использовать очень сильные системы типов. Однако еще одна вещь, которая делает такие языки, как Idris, такими особенными, - это их декларативный синтаксический стиль, который больше выглядит так, как если бы вы описывали вещи, а не более интуитивно понятный командный стиль (сделайте то, потом то) написания кода императивного стиля.

Суматранский кофе также является особенным видом кофе из-за способа его обработки, а также климата, в котором он растет. Таким образом, вкус суматранского кофе сильно отличается от того, что вы ожидаете от него по вкусу. На вкус он почти чужд для тех, кто привык к «обычному» кофе, который можно найти в обычном кафе. Точно так же Idris или Haskell выглядят почти чуждыми для тех, кто привык к более императивным языкам программирования, таким как C или Java.

Однако, помимо всего этого, наиболее отличительной чертой Идриса является не то, что это язык функционального программирования как таковой, а нечто более уникальное: зависимые типы. Вы можете улучшить тип, указав вместе с ним значение. Хорошим примером для этого может служить функция concat, набираемая примерно как List n t -> List m t -> List (n + m) t. Первым аргументом будет список из n элементов, вторым - список из m элементов, а результатом будет список из n + m элементов. Как это круто?! С зависимыми типами вы получаете совершенно новый уровень контроля над тем, чего ожидать от вашего кода. В моей книге это всегда хорошо.

Если вы готовы попробовать что-то необычное и захватывающее, будь то идрис, суматранский кофе или (что еще лучше) и то, и другое: приготовьтесь и наслаждайтесь поездкой!

isSumatranCoffee : String -> Bool
isSumatranCoffee "Sumatran" = True
isSumatranCoffee _ = FalsedrinkOrPass : String -> String
drinkOrPass coffee = case isSumatranCoffee coffee of
  True => "I'll have some of that Sumatran coffee, please!"
  False => "No thanks, I'd rather have something else"
main : IO ()
main = putStrLn (drinkOrPass "Sumatran")

Конечно, есть много других языков программирования и кофейных зерен, о которых стоит поговорить. Как никарагуанский кофе с его кислотными нотками, ароматное чудо эфиопского кофе, эзотерическое 8-е с его синтаксисом на основе стека, или Clojure (which is a cool language (based on Lisp (which means (it uses lots of parentheses)))).

Надеюсь, мне удалось вызвать ваше любопытство по крайней мере по одной из комбинаций, которые я соединил выше. Мало что может быть веселее, чем пробовать новые языки программирования. Совместите это с чашкой кофе, приготовленного из свежеобжаренных зерен, и готово!

Первоначально опубликовано на https://fidel.uk.