Схематический язык для программирования

ДраконКод-схемы построены на основе ДРАКОН-схем, но со множеством отличий:
  1. все виды циклов создаются лишь через иконы цикла, иконы цикла взяты из схемы Силуэт;
  2. вход в икону может быть не только сверху, но и слева;
  3. в некоторых случаях возможен переход наверх без стрелки;
  4. группы икон выделены своим цветом, вложенные циклы выделяются разными оттенками цвета;
  5. можно использовать несколько выходов (return);
  6. есть висящие иконы внутри алгоритма (break, continue).
file
function
yield
return
while, do
break
for, foreach
continue
end, (do) while
if
elseif
if (not, break)
switch, match
case
comment
action
print
try catch Error throw finally block
A B C D Exit? A C B D
Так как разрешено поднимать линию наверх, то руководствуемся правилом, что вход всегда сверху или слева, а выход всегда снизу или справа, благодаря этому указывать стрелкой направление движения не требуется. Нижняя икона Вопрос показывает, что под ней скрыта реализация более сложной логики, при входе в такую икону она будет раскрыта. Если результат исполнения кода прерывает исполнение программы или цикла, например, if(exit) {break;}, тогда используем правую икону Вопрос, чтобы произвести ответвление от шампура. Вторая схема это инвертированное условие первой схемы.

Ветвление

if-elseif-else a > b a больше b a == b a равен b a меньше b A and not B or C and D A B C D not (A and not B or C and D) A C B D switch-case (0 и 1 без break, 2 и 3 с break, default блока нет) i 0, 1 i меньше 2, и 2 i меньше 3,но > 0 3 i равно 3

Циклы

while i = 1 i <= 10 i ++ do-while i = 1 i ++ i <= 10 for i = 1 i <= 10 i i ++ foreach i range (1, 10) i
product_id local limit = get_limit(product_id) limit >= count Нет Да product_id = get_next_product(product_id) product_id nil
while product_id do
	local limit = get_limit(
		product_id
	)
	if limit >= count then
		return product_id
	end
	product_id = get_next_product(product_id)
end
return nil

-- vs https://github.com/stepan-mitkin/drakonhub/blob/master/app/web.lua ; line=5716 ; function suggest_product
while true do
	if product_id then
		
	else
		return nil
	end
	local limit = get_limit(
		product_id
	)
	if limit >= count then
		return product_id
	end
	product_id = get_next_product(product_id)
end

Алгоритм Луна Входные данные:Последовательность десятичных цифр,крайняя справа цифра – контрольная Обратить последовательность Изменить каждую цифрув последовательности Цифра стоит начётном месте? Нет Да Умножить цифру на 2 Число больше 9 теперь? Да Нет Вычесть из числа 9 Без изменений Рассчитать сумму цифрпоследовательности послеизменений Сумма кратна 10? Да Нет Исходные данные верны Исходные данные неверны Результат

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

Нажмите на схему, чтобы выключить или включить подсказки.

Исходный код этой же схемы, который будет сформирован именно в таком виде автоматически. В исходный код можно будет вносить изменения, которые тут же будут отображены в схеме.

Регистрацияпользователя Имя пользователяE-mailПароль Проверитьимя Обрезать пробелыв имени Имя пусто? Имя слишкомдлинное? Имя содержитнеподдерживаемыесимволы? Ошибка именипользователя Проверитьe-mail Обрезать пробелыв e-mail E-mail пуст? E-mail слишкомдлинный? E-mail имеетправильный формат? Ошибка e-mail Проверитьпароль Не обрезаемпробелы в пароле! Пароль слишкомдлинный? Пароль достаточносложный? Пароль содержитимя? Ошибка пароля Проверитьуникальность Имя пользователязанято? E-mail занят? Ошибкауникальности Записать в базуданных Открыть базу данных Вставить запись втаблицу Пользователи. Записать туда имя иe-mail. Вставить запись втаблицу паролей. Записать туда пароль(хэш). Связать запись спользователем. Exception Откатить записи Ошибка базыданных Закрыть базу данных Вернуть кодуспеха

/**
 * Регистрация пользователя
 *
 * @param $name Имя пользователя
 * @param $email E-mail
 * @param $password Пароль
 */
function registerUser($name, $email, $password) {
	/**
	 * Проверить имя
	 */

	// Обрезать пробелы в имени
	$name = trim($name);

	// Имя пусто?
	// Имя слишком длинное?
	// Имя содержит неподдерживаемые символы?
	if (
		empty($name) ||
		strlen($name)>20 ||	
		preg_match('/[^a-z0-9]/g', $name) 
	) {

		// Ошибка имени пользователя
		return ERROR_NAME;
	}

	/**
	 * Проверить e-mail
	 */

	// Обрезать пробелы в e-mail
	$name = trim($name);

	// E-mail пуст?
	// E-mail слишком длинный?
	// E-mail имеет правильный формат?
	if (
		empty($email) ||
		strlen($email)>100 ||
		! preg_match('/[\w\d\.-_]+@[\w\d\.-_])/g', $email)
	) {

		// Ошибка e-mail
		return ERROR_EMAIL;
	}

	/**
	 * Проверить пароль
	 */

	/*
	 * Не обрезаем пробелы в пароле
	 */

	// Пароль слишком длинный?
	// Пароль достаточно сложный?
	// Пароль содержит имя?
	if (
		strlen($password)>100 ||
		! preg_match('/(\w\d|\d\w)/', $password) ||
		strstr($password, $name)
	) {

		// Ошибка пароля
		return ERROR_PASSWORD;
	}

	/**
	 * Проверить уникальность
	 */

	// Имя пользователя занято?
	// E-mail занят?
	if (
		User::getName($name) ||
		User::getEmail($email)
	) {

		// Ошибка уникальности
		return ERROR_UNIQUE;
	}

	/**
	 * Записать в базу данных
	 */
	
	// Открыть базу данных
	$db = SQL::connect();

	try {

		// Вставить запись в таблицу Пользователи.
		// Записать туда имя и e-mail.
		$db->beginTransaction();
		$user_id = $db->insert('user', [
			'name'=>$name,
			'email'=>$email
		]);

		// Вставить запись в таблицу паролей.
		// Записать туда пароль (хэш).
		// Связать запись с пользователем.
		$db->insert('user_password', [
			'user_id'=>$user_id,
			'password_hash'=>hash_hmac('sha256', $password, $email)
		]);
		$db->commit();
	} catch(Exception $e) {

		// Откатить записи
		$db->rollback();

		// Ошибка базы данных
		return ERROR_DB;
	} finally {

		// Закрыть базу данных
		$db->close();
	}

	// Вернуть код успеха
	return SUCCESS;
}

Схема с исходным кодом вместо комментариев, например, если их нет.

registerUser $name$email$password $name = trim($name) empty($name) strlen($name)>20 preg_match('/[^a-z0-9]/g', $name)) ERROR_NAME $name = trim($name); empty($email) strlen($email)>100 preg_match('/[\w\d\.-_]+@[\w\d\.-_])/g',$email) ERROR_EMAIL strlen($password)>100 preg_match('/(\w\d|\d\w)/', $password) strstr($password, $name) ERROR_PASSWORD User::getName($name) User::getEmail($email) ERROR_UNIQUE $db = SQL::connect(); $db->beginTransaction(); $user_id = $db->insert('user', ['name'=>$name,'email'=>$email]); $db->insert('user_password',['user_id'=>$user_id,'password_hash'=>hash_hmac('sha256', $password, $email)]); $db->commit(); Exception $e $db->rollback() ERROR_DB $db->close(); SUCCESS

Код без комментариев, максимально компактный.

function registerUser($name, $email, $password) {

	$name = trim($name);

	if (empty($name) || strlen($name)>20 || preg_match('/[^a-z0-9]/g', $name)) {
		return ERROR_NAME;
	}

	$name = trim($name);

	if (empty($email) || strlen($email)>100 || ! preg_match('/[\w\d\.-_]+@[\w\d\.-_])/g', $email)) {
		return ERROR_EMAIL;
	}

	if (strlen($password)>100 || ! preg_match('/(\w\d|\d\w)/', $password) || strstr($password, $name)) {
		return ERROR_PASSWORD;
	}

	if (User::getName($name) || User::getEmail($email)) {
		return ERROR_UNIQUE;
	}

	$db = SQL::connect();
	try {
		$db->beginTransaction();
		$user_id = $db->insert('user', ['name'=>$name, 'email'=>$email]);

		$db->insert('user_password', ['user_id'=>$user_id, 'password_hash'=>hash_hmac('sha256', $password, $email)]);
		$db->commit();
	} catch(Exception $e) {
		$db->rollback();
		return ERROR_DB;
	} finally {
		$db->close();
	}
	return SUCCESS;
}