Один способсказать.

Язык программирования Топаз создан специально для вёрстки текста. На нём пишут программы, которые готовят к печати документы от книг до отчётов и счетов, а также утилиты командной строки и логику приложений. Один исходный код можно запустить на компьютере или собрать в пакет для браузера.

Запустите программу сейчас и получите показанный результат.

TOPAZ
function привет(имя: string) -> string {
    return "Привет, {имя}!"
}

print(привет("Топаз"))
вывод
Привет, Топаз!

ATLAS

Инструмент вёрстки на Топазе

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

Страница 18 корейской книги, свёрстанной в ATLAS
Страница 18 книги, свёрстанной в ATLAS
TOPAZ
function неЛатинскийПробел(следующий: Option<string>) -> bool {
  match следующий {
    case Some(текст) => !латинскийПробел(текст)
    case None => true
  }
}
function безЗапретаВНачале(следующий: Option<string>) -> bool {
  match следующий {
    case Some(текст) => !запрещёнВНачале(текст)
    case None => true
  }
}

Фрагмент правил разбиения на строки в ATLAS

Почему Топаз хорошо справляется с вёрсткой

Термины вёрстки в именах

Называйте функции и переменные терминами вёрстки на корейском, русском или английском. Топаз хранит символы рукописи ровно в том виде, в каком их ввели.

Строки и шаблоны →

Одно правило для просмотра и вывода

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

Интерпретатор и бэкенды →

Вычисления без тихих ошибок

Тип int представляет знаковое 64-разрядное целое число. При переполнении программа останавливается на этом месте и не продолжает работу с неверным значением. Если считать ширину строк и стоимость раскладки в целых числах, переполнение не останется в результате незамеченным.

Поведение среды выполнения →

Пропущенный вариант остановит сборку

Задайте фиксированный набор случаев, например классы разрыва строки, перечислением, и компилятор проверит, что каждое сопоставление match обрабатывает все варианты. Если позже добавить вариант, сборка покажет каждое сопоставление, которое его ещё не обрабатывает.

Шаблоны и управление потоком →

Лиспекс

Расчёт на Топазе, решения на Лиспексе

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

  • Правила не обращаются к файлам, системным часам и сети.
  • Правило останавливается там, где превышает лимит.
  • Одинаковые правило, вход и настройки каждый раз дают одно и то же решение.
LISPEX
(let ((минимум-строк 2))
  (if (< input минимум-строк) "перенести" "оставить"))

Файл rules/висячие-строки.lspx целиком

TOPAZ
import src.значения { однаЦифра, текстИз }
import std.lispex { defaultLimits, evaluate }
import std.lispex.rules as rules

export function main(args: Array<string>, stdin: string) -> Result<int, string> {
    let правило = rules.висячие_строки()
    for осталосьСтрок in [1, 2] {
        match evaluate(правило, однаЦифра(осталосьСтрок)?, defaultLimits(правило)) {
            case Ok(Complete(итог)) => print("осталось строк {осталосьСтрок}: {текстИз(итог)}")
            case _ => return Err("правило не завершилось")
        }
    }
    Ok(0)
}
вывод
осталось строк 1: перенести
осталось строк 2: оставить

Файл src/main.tpz целиком. однаЦифра и текстИз преобразуют значения Лиспекса.

Правила Лиспекса выполняются в интерпретаторе и в нативных сборках. Полная настройка, включая манифест и файлы лимитов, описана в разделе Запуск правил Лиспекса.

А также бизнес-правила и обработка данных

TOPAZ
function скидка(клиент: { уровень: string, стаж: int }) -> float {
    return match клиент {
        case { уровень: "премиум", стаж } if стаж > 5 => 0.3
        case { уровень: "премиум" } => 0.2
        case { стаж } if стаж > 1 => 0.1
        case _ => 0.0
    }
}

print("{скидка({ уровень: "премиум", стаж: 7 })}")
print("{скидка({ уровень: "новый", стаж: 0 })}")
вывод
0.3
0.0
TOPAZ
function очистить(слова: Array<string>) -> Array<string> {
    return filter(слова, (слово: string) => слово != "")
}

function воскликнуть(слова: Array<string>) -> Array<string> {
    return map(слова, (слово: string) => слово + "!")
}

let фраза = ["один", "", "способ", "", "сказать"]
    |> очистить
    |> воскликнуть
print("{фраза}")
вывод
[один!, способ!, сказать!]

Примеры конкурентности и освобождения ресурсов приведены в разделах Конкурентность и Defer и ресурсы.

Обзор Топаза

Изучите Топаз, найдите ответы и начните разработку.

Узнайте, для каких задач создан Топаз. Пройдите пошаговое руководство, сверьтесь с картой синтаксиса и выберите нужные инструменты. Устанавливаемый компилятор тоже написан на Топазе. Как компилятор проверяет собственную сборку →