Pull to refresh

Comments 6

Нет, не проще, если у вас есть правильный инструмент.

Честно говоря, в обоих представленных пакетах не нашел такого, что нельзя было бы написать на том же python просто немного другими синтаксическими конструкциями.


Не совсем понимаю, зачем нужен dsl, если он не уменьшает количество информации. Для уменьшения количества символов?

Как раз только что эту статью прочитал в оригинале. Спасибо за перевод, несколько замечаний:
Yikes можно было бы перевести как «Упс» или «Бывает».
И в том же абзаце речь совсем не о «работе по дизайну типов», а о «типографских разработках».
Перевод такой прекрасной статьи (на самом деле главы из книги), и всего 12 плюсов. Я думаю, это потому, что тема действительно сложна. Языково-ориентированное программирование, это, скорее всего то, к чему мэйнстрим придет после ФОП, но, как-то медленно мы туда продвигаемся.

Эволюцию парсеров (и сопутствующих компиляторных технологий) я представляю примерно так:
* рекурсивный спуск, парсеры пишут вручную. Никлаус Вирт придумывает Pascal.
* Кнут изобретает LR-парсинг, он «пошире», в смысле поддерживает более широкий класс грамматик, но оказывается так, что вручную так писать парсеры гораздо сложнее, чем рекспуск, и почти невозможно
* появляются инструменты Lex и Yacc, которые генерируют LR-парсеры по BNF-грамматикам
* также (уже потом-потом) появляются инструменты вроде ANTLR, которые по BNF-грамматикам генерируют LL-парсеры
* появляются техники вроде написания аппликативных парсеров на Haskell, что освоившим этот дзен программистам кажется удобнее, чем пользоваться «костылями» вроде Lex и Yacc
* все это время программисты на разных LISPах совершенствуют техники кодогенерации и свои так называемые «макросы» (программы, которым на вход дают текст программы на одном ЯП, а на выходе они выдают текст эквивалентной программы на другом ЯП)
* сайт racket-lang.org в 2019 году выглядит живее всех живых
* и еще они там прямо этим летом (2019) в Солт-Лейк-Сити собираются проводить интенсив по Racket и ЯОП
• ну и еще умнейший Пол Грэм уж сколько лет топит о том же, мол ЯОП это круто, а макросы в LISP это такая штука, которая разработку этих самых ЯОП делает полегче. Ну, когда ее освоишь.

Но тема, видимо, действительно непростая. У меня вот какой-то опыт в программировании есть, но, когда я вижу исходники на LISPе или на Haskell, которые реализуют даже простой парсер, сама собой приходит на ум цитата «Не тот язык назвали Brainfuck'ом» )
Полюбуйтесь, что ли: это первый и самый легкий пример из книги, глава из которой переведена:
#lang br/quicklang

(define (read-syntax path port)
  (define src-lines (port->lines port))
  (define src-datums (format-datums '(handle ~a) src-lines))
  (define module-datum `(module stacker-mod stacker-demo/stacker
                          ,@src-datums))
  (datum->syntax #f module-datum))
(provide read-syntax)

(define-macro (stacker-module-begin HANDLE-EXPR ...)
  #'(#%module-begin
     HANDLE-EXPR ...
     (display (first stack))))
(provide (rename-out [stacker-module-begin #%module-begin]))

(define stack empty)

(define (pop-stack!)
  (define arg (first stack))
  (set! stack (rest stack))
  arg)

(define (push-stack! arg)
  (set! stack (cons arg stack)))

(define (handle [arg #f])
  (cond
    [(number? arg) (push-stack! arg)]
    [(or (equal? * arg) (equal? + arg))
     (define op-result (arg (pop-stack!) (pop-stack!))) 
     (push-stack! op-result)]))
(provide handle)

(provide + *)

Sign up to leave a comment.

Articles