Как стать автором
Обновить

Код из цитат Шварценеггера и песен Битлов: как мир искусства проникал в эзотерические языки программирования

Уровень сложностиПростой
Время на прочтение18 мин
Количество просмотров1.9K
Всего голосов 8: ↑8 и ↓0+10
Комментарии2

Комментарии 2

Может код на Chef и выглядит как рецепты для кухарок, но писали его далеко не кухарки.

Документация начинается с интригующей записи kitchen |- -> ((M, B, I, F), T) , а далее идёт

программа на Хакеле
kitchen |- <S, (M, B, I, F)> -> ((M`, B`, I`, F`), T)

--
Informeel: 

kitchen is de omgeving met eventuele sous-chefs
S is een statement in Chef
M zijn de mixing bowls. M is een lijst van lijsten (stacks).
B zijn de baking dishes. B is een lijst van lijsten (stacks).
I is een functie die de waarde en fase van een ingredient oplevert.
F is de koelkast; een lijst van waarden uit STDIN
T is de break/continue/proceed

--
Formeel:

##hier even alle statements, zie http://www.dangermouse.net/esoteric/chef.html
S   	:: Here be dragons //@TODO

I : String -> Ingr

Phase 	:: L | S
Ingr 		:: (Integer, Phase)

M		:: [m : M] 		| ε
m		:: [Ingr : m] 		| ε

B		:: [b : B] 		| ε
b		:: [Ingr : b] 		| ε

F 		:: [Integer : F]	| ε

T		:: 0 | @ | *

F = Epsilon
f :: Integer

## nodige functies
pushMB : (Integer, Phase) Integer M -> M
pushMB((v, p), n, [m:M])  	{= [(v,p) : m]                 	n = 0
                          	{= [m:pushMB((v,p), n-1, M)]   	n > 0


headMB : Integer M -> (Integer, Phase)
headMB(n, [[(v,p):m]:M])	{= (v, p)					n = 0
					{= headMB(n-1, M)			n > 0

tailMB : Integer M -> M
tailMB(n, [[(v,p):m]:M])	{= m						n = 0
					{= tailMB(n-1, M)			n > 0

ingrVal : (Integer, Phase) -> Integer
ingrVal (v, p) = v

ingrPhase : (Integer, Phase) -> Phase
ingrPhase : (v, p) = p


f(X) = [hd(X) : tail(X)] (is gelijk aan X)


## Concatenatieregel heeft nog geen rekening gehouden met break en continue. Hihi.
0)	kitchen |- <S_1, (M, B, I, F)> -> ((M``, B``, I``, F``), T)	kitchen |- <S_2, M``, B``, I``, F``)> -> ((M`, B`, I`, F`), T`)
	____________________________________________________________________________________________________________________
	kitchen |- <S_1. S_2, (M, B, I, F)>						-> ((M`, B`, I`, F`), T`)

1)	kitchen |- <Take ingr from refrigerator, (M, B, I, [f:F])> 	-> ((M, B, I[ingr -> (f, phase(ingr))], F), 0)

2a)	kitchen |- <Put ingr into nth mixing bowl, (M, B, I, F)> 			-> ((headMB(n, M), B, I, F), 0) 
2b)	kitchen |- <Put ingr into mixing bowl, (M, B, I, F)> 			-> ((headMB(0, M), B, I, F), 0)

3a)	kitchen |- <Fold ingr into [nth] mixing bowl, (M, B, I, F])>		-> ((headMB(n, M), B, I[ingr -> popMB(n, M)], F), 0)
3b)	kitchen |- <Fold ingr into mixing bowl, (M, B, I, F])>			-> ((headMB(0, M), B, I[ingr -> popMB(0, M)], F), 0)
3c)	kitchen |- <Fold ingr, (M, B, I, F])>						-> ((headMB(0, M), B, I[ingr -> popMB(0, M)], F), 0)

4a)	kitchen |- <Add ingr to nth mixing bowl, (M, B, I, F)> 		-> ((pushMB((ingrVal(head(n, M)) + ingrVal(ingr), ingrPhase(head(n, M))), n, tail(n, M)), B, I, F), 0)
4b)	kitchen |- <Add ingr to mixing bowl, (M, B, I, F)> 			-> ((pushMB((ingrVal(head(0, M)) + ingrVal(ingr), ingrPhase(head(0, M))), 0, tail(n, M)), B, I, F), 0)
4c)	kitchen |- <Add ingr, (M, B, I, F)> 						-> ((pushMB((ingrVal(head(0, M)) + ingrVal(ingr), ingrPhase(head(0, M))), 0, tail(n, M)), B, I, F), 0)

5a)	kitchen |- <Remove ingr from nth mixing bowl, (M, B, I, F)>		-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(n, M)), ingrPhase(popMB(n, M))) n M), B, I, F), 0)
5b)	kitchen |- <Remove ingr from mixing bowl, (M, B, I, F)>			-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
5c)	kitchen |- <Remove ingr, (M, B, I, F)>						-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)

6a)	kitchen |- <Combine ingr from nth mixing bowl, (M, B, I, F)>		-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(n, M)), ingrPhase(popMB(n, M))) n M), B, I, F), 0)
6b)	kitchen |- <Combine ingr from mixing bowl, (M, B, I, F)>			-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
6c)	kitchen |- <Combine ingr, (M, B, I, F)>						-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)

7a)	kitchen |- <Divide ingr into nth mixing bowl, (M, B, I, F)> 	-> ((pushMB(ingrVal(ingr) / (ingrVal(head(n, M)), ingrPhase(head(n, M))), n, tail(n, M)), B, I, F), 0)
7b)	kitchen |- <Divide ingr into mixing bowl, (M, B, I, F)> 		-> ((pushMB(ingrVal(ingr) / (ingrVal(head(0, M)), ingrPhase(head(0, M))), 0, tail(0, M)), B, I, F), 0)
7c)	kitchen |- <Divide ingr, (M, B, I, F)> 					-> ((pushMB(ingrVal(ingr) / (ingrVal(head(0, M)), ingrPhase(head(0, M))), 0, tail(0, M)), B, I, F), 0)


8)	kitchen |- <Add dry ingredients to nth mixing bowl, (M, B, I, F)> ->	OK DIT GAAN WE VRAGEN

9a)	kitchen |- <Liquefy ingr, (M, B, I, F)>						-> ((M, B, I[ingr -> (ingrVal(I[ingr]), L)], F), 0)
9b)	kitchen |- <Liquify ingr, (M, B, I, F)>						-> ((M, B, I[ingr -> (ingrVal(I[ingr]), L)], F), 0)

10)	<Liquefy
_____________________________________________________________________________________________________________________________________________________
kitchen |- <Liquefy contents of the nth mixing bowl, (M, B, I, F)>	-> 

https://github.com/joostrijneveld/Chef-Interpreter/blob/master/ChefInterpreter/signatuur.txt

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

Малболге хотя бы подкинул головняка.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий