]]> ]]>
Править | Обсудить | История

Chef

Парадигма:
Типизация:
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Chef — эзотерический язык программирования, созданный Дейвидом Морган-Маром (David Morgan-Mar), в котором все программы выглядят как рецепты. Основной принцип языка — программы должны не только выполняться и генерировать правильный вывод, но и быть просты в приготовлении, а получившееся блюдо должно быть восхитительно на вкус. Впрочем, последнее компиляторы не проверяют.

Язык оперирует следующими понятиями:

  • ингредиент — переменная. Название ингредиента задает ее имя, количество — значение, а консистенция (сухой или жидкий) — тип при выводе на печать (число или ASCII-код).
  • миски и формы для выпечки — стеки, в которых хранятся целочисленные значения. Над значениями в стеках-мисках производятся все действия; формы для выпечки служат для вывода их содержимого на печать. Запас мисок и форм неограничен; если их используется несколько, на них ссылаются по их номерам (“первая миска”).

Структура программы

Программа-рецепт состоит из следующих частей:

  • Название рецепта. Кратко описывает назначение программы (например, “Hello World Souffle” или “Fibonacci Numbers with Caramel Sauce”).
  • Комментарии. Необязательный абзац произвольного содержания.
  • Список ингредиентов. Здесь объявляются переменные, которые будут использованы в программе. Можно также задать их консистенцию, указав их единицы измерения, и начальное значение. В качестве названия ингредиента можно использовать что угодно.
  • Время приготовления и температура духовки. Необязательный пункт, использующийся только для придания рецепту правдоподобия.
  • Метод. Тело программы, состоящее из последовательности команд.
  • Количество порций. Выводит на печать содержимое соответствующего количества форм для выпечки, в порядке возрастания номера формы. Содержимое одной формы выводится сверху вниз.
  • Вспомогательные рецепты. Аналог процедур в других языках; оперируют своими наборами ингредиентов, форм и мисок, а также копиями форм и мисок главного рецепта. Когда вспомогательный рецепт завершен, содержимое его первой миски помещается в первую миску главного рецепта в том же порядке.

Команды языка

  • Take ingredient from refrigerator. — читает число из потока ввода и записывает его в переменную.
  • Put ingredient into [nth] mixing bowl. — добавляет ингредиент в n-ую миску. Здесь и далее пропуск индекса означает, что используется только одна миска.
  • Fold ingredient into [nth] mixing bowl. — извлекает верхнее значение из миски и записывает его в переменную.
  • Add ingredient [into [nth] mixing bowl]. — прибавляет значение переменной к верхнему элементу миски.
  • Remove ingredient [from [nth] mixing bowl]. — вычитает значение из верхнего элемента миски.
  • Combine ingredient [into [nth] mixing bowl]. — умножает верхний элемент миски на значение переменной.
  • Divide ingredient [into [nth] mixing bowl]. — делит верхний элемент миски на значение переменной.
  • Add dry ingredients [to [nth] mixing bowl]. — суммирует значение всех сухих ингредиентов и добавляет результат в миску. Здесь и далее пропуск слов “mixing bowl” означает, что используется единственная миска.
  • Liquefy ingredient. — меняет тип ингредиента на жидкий.
  • Liquefy contents of the [nth] mixing bowl. — меняет тип всех ингредиентов в миске на жидкий.
  • Stir [the [nth] mixing bowl] for N minutes. — перемещает верхний элемент миски на N позиций вниз, а все элементы выше него — на одну позицию вверх.
  • Stir ingredient into the [nth] mixing bowl. — выполняет действие Stir, используя в качестве N значение ингредиента.
  • Mix [the [nth] mixing bowl] well. — перемешивает элементы миски в случайном порядке.
  • Clean [nth] mixing bowl. — удаляет все элементы миски.
  • Pour contents of the [nth] mixing bowl into the [pth] baking dish. — копирует элементы миски в форму, сохраняя их порядок и размещая их поверх значений, которые уже там находились.
  • Verb the ingredient. — начало цикла. Цикл выполняется до тех пор, пока значение ингредиента-счетчика не станет равным нулю. Для обозначения цикла можно использовать любой глагол.
  • Verb [the ingredient] until verbed. — конец цикла. Должен использовать тот же глагол. Если ингредиент указан, при выполнении этой команды его значение уменьшается на 1. Этот ингредиент может быть не тем, который используется в качестве счетчика.
  • Set aside. — прерывание цикла.
  • Serve with auxiliary-recipe. — вызывает вспомогательный рецепт. Выполнение главного рецепта приостанавливается до завершения вспомогательного.
  • Refrigerate [for N hours]. — прерывание выполнения рецепта. Если количество часов N задано, перед выходом из рецепта будет напечатано содержимое первых N форм для выпечки.

Примеры:

Hello, World!:

Пример для версий Acme-Chef-1.01

Каждый ингредиент соответствует ASCII-коду одного из использующихся символов; для удобства названия ингредиентов начинаются с соответствующих букв. Коды размещаются в миску в порядке, обратном порядку символов в сообщении. Затем команда Liquify (старое написание команды) уточняет, что все значения в миске следует выводить как символы, а не как числа. Наконец, содержимое миски переносится в форму для запекания и командой Serves 1 выводится на печать.

Lobsters with Fruit and Nuts.

This recipe prints "Hello, World!" in a most delicious way.

Ingredients.
72 g hazelnuts
101 eggs
108 g lobsters
111 ml orange juice
44 g cashews
32 g sugar
87 ml water
114 g rice
100 g durian
33 passion fruit
10 ml lemon juice

Method.
Put lemon juice into the mixing bowl.
Put passion fruit into the mixing bowl.
Put durian into the mixing bowl.
Put lobsters into the mixing bowl.
Put rice into the mixing bowl.
Put orange juice  into the mixing bowl.
Put water into the mixing bowl.
Put sugar into the mixing bowl.
Put cashews into the mixing bowl.
Put orange juice into the mixing bowl.
Put lobsters into the mixing bowl.
Put lobsters into the mixing bowl.
Put eggs into the mixing bowl.
Put hazelnuts into the mixing bowl.
Liquify contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

Serves 1.

Факториал:

Пример для версий Acme-Chef-1.01

Используется итеративное вычисление факториала. Ингредиенты, измеряющиеся в ml, — жидкие и соответствуют символам в выводе, измеряющиеся в g — сухие и соответствуют числам.

Программа состоит из двух циклов. Первый, chop ... until choped — вычисляет факториал следующего числа и заносит в первую миску все элементы (символы и числа), которые нужно будет вывести на печать. Но из-за того, что факториалы вычисляются по возрастанию, первыми нужно выводить значения со дна стека. Для этого используется вторая миска и второй цикл mash ... until mashed, который перекладывает элементы из первой миски во вторую, в результате чего они будут поступать на печать в правильном порядке.

В текущей версии интерпретатора неправильно обрабатываются жидкие ингредиенты — ни модификаторы при их объявлении, ни команда luquify не переводят их в жидкое состояние, поэтому вывод программы выглядит следующим образом:

0 33 32 61 32 1 10 1 33 32 61 32 1 10 2 33 32 61 32 2 10 3 33 32 61 32 6 10 4 33 32 61 32 24 10 5 33 32 61 32 120 10 6 33 32 61 32 720 10 7 33 32 61 32 5040 10 8 33 32 61 32 40320 10 9 33 32 61 32 362880 10 10 33 32 61 32 3628800 10 11 33 32 61 32 39916800 10 12 33 32 61 32 479001600 10 13 33 32 61 32 6227020800 10 14 33 32 61 32 87178291200 10 15 33 32 61 32 1307674368000 10 16 33 32 61 32 20922789888000 10

Factorial as a Piece of Cake.

This recipe calculates and prints factorials of first integers.

Ingredients.
33 ml exclamation
32 ml space
61 ml equal
10 ml newline
0 g n
1 g f
1 g one
17 g iterator
119 g second iterator

Method.
Liquify exclamation.
Liquify space.
Liquify equal.
Liquify newline.
Chop iterator.
Put n into 1st mixing bowl.
Put exclamation into 1st mixing bowl.
Put space into 1st mixing bowl.
Put equal into 1st mixing bowl.
Put space into 1st mixing bowl.
Put f into 1st mixing bowl.
Put newline into 1st mixing bowl.
Put n into 1st mixing bowl.
Add one into 1st mixing bowl.
Fold n into 1st mixing bowl.
Put f into 1st mixing bowl.
Combine n into 1st mixing bowl.
Fold f into 1st mixing bowl.
Chop iterator until choped.
Mash second iterator.
Fold n into 1st mixing bowl.
Put n into 2nd mixing bowl.
Mash second iterator until mashed.
Pour contents of 2nd mixing bowl into the baking dish.

Serves 1.

Числа Фибоначчи:

Пример для версий Acme-Chef-1.01

Используется итеративное определение чисел Фибоначчи. Последнее и предпоследнее числа хранятся в переменных fib1 и fib2. За одну итерацию вычисляется следующее число, а предыдущее дописывается в стек и остается в нем для последующего вывода. Второй цикл пересыпает значения во вторую миску в обратном порядке, чтобы на печать они выводились в правильном порядке, по возрастанию.

Данная версия интерпретатора не позволяет работать с символами и числами вперемешку, поэтому формат вывода не соблюдается, и результат работы программы выглядит следующим образом:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Fibonacci numbers.

This recipe calculates and prints first Fibonacci numbers.

Ingredients.
0 g fib1
1 g fib2
16 g iterator
16 g second iterator

Method.
Chop iterator.
Put fib2 into 1st mixing bowl.
Put fib2 into 1st mixing bowl.
Add fib1 into 1st mixing bowl.
Fold fib2 into 1st mixing bowl.
Fold fib1 into 1st mixing bowl.
Put fib1 into 1st mixing bowl.
Chop iterator until choped.
Mash second iterator.
Fold fib1 into 1st mixing bowl.
Put fib1 into 2nd mixing bowl.
Mash second iterator until mashed.
Pour contents of 2nd mixing bowl into the baking dish.

Serves 1.

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам