====== Написання модулів на Brainfuck ====== Починаючи, з релізу Ubilling 0.8.5 Valhalla стало можливим використовувати код на [[https://ru.wikipedia.org/wiki/Brainfuck|Brainfuck]] у своїх модулях. ====== Навіщо? ====== Мова Brainfuck відома своїм мінімалізмом і крім того є Тьюринг-повною мовою. Наша команда розробників, своєю чергою, вважає, що витончений і водночас функціональний синтаксис Brainfuck якнайкраще підходить для розроблення прикладних модулів для Ubilling, і максимально відповідає його ідеології. Також ми не сприймаємо дискримінацію в будь-яких її проявах, і вважаємо, що всі мають право розробляти модулі для Ubilling, незалежно від статі, раси, релігії, статевої орієнтації та взаємовідносин з важкими наркотиками.... ====== Трохи прикладів ====== Підключаємо інтерпретатор Brainfuck із відповідної бібліотеки. require_once('api/vendor/bf/Brainfuck.php'); $bf=new dotzero\Brainfuck(); Просто виконання коду: $code = '++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++.+++++++++++++.>------.+++..---.+++++.<+++++.'; $bf->setCode($code); show_window(__('Brainfuck code execution result'), $bf->run(true)); А якщо нам хочеться передати якісь вхідні дані? Все так само дуже просто: $bf->setCode('>,[>,]<[<]>[.>]'); $bf->setInput('this is input data'); show_window('input test', $bf->run(true)); Але, можливо, ми хочемо інкапсулювати всередину PHP код, працювати з базою і робити інші круті речі, наприклад показати список користувачів у вигляді красивої таблички? Та скільки влізе: $code='++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>++++++.>>---.+++++++++++..<---------.<----.>>++++++++++++++.-----------------' . '-------.---.----------.++++++++++++++++++++++++++++++.--------------.+++++++++++++.<++++++++++.>-------------.++++++++' . '+++++++.<------.>--------..<++++++++++++++++++.>++++++++.<++++++++++++++.>--.<++++++.------.>++++++++.<++++.>--------.' . '<-------------------------.>---.--------.++.+++++.+++++.<<++++++++.+.>-----------------.<---------.>>.-----------.++++' . '+++.++++++++.------------------------.++++++++++++++++++++++++.--------------.+++++.----------.+++++++++++.++++++++.<<+' . '+++++++.>>------------------------..<<.-.>>----------.++++++++++++++++++++++++++++++.--------------.+++++++++++++.+.<<' . '-------.>>-------.---.++++++++++.+.<<+++++++.++.+++.------------..>>+++.------------------.---.---.----------.++++++++' . '++++++++++++++++++++++.--------------.+++++++++++++.<++++++.>..-----------------.++++++++++++++++++++++++.<++++++++++++' . '++++++.>-----------------.+++++++.++++++++.<++++++++++++++++++.>-----.<<++++++++.----.>----.>------..<<+++++..+++++++++' . '+++++++++.'; $bf->setCode($code); $bf->execute(); Ну і власне результат:\\ {{:bfuserlist.png?600|}} ====== Пам'ятка із синтаксису ====== Весь синтаксис складається аж із 8-ми операторів: - **>** Перейти до наступної комірки - **<** Перейти до попередньої комірки - **+** Збільшити значення в поточній комірці на 1 - **-** зменшити значення в поточній комірці на 1 - **.** надрукувати значення поточної комірки - **,** Ввести ззовні значення і зберегти в поточну комірку - **[** Якщо значення поточної комірки - нуль, перейти вперед по тексту програми до **]** з урахуванням вкладеності - **]** Якщо значення поточної комірки не дорівнює нулю, перейти назад за текстом програми до **[** з урахуванням вкладеності