LINUX.ORG.RU

История изменений

Исправление theNamelessOne, (текущая версия) :

Дальше мне просто лениво, но в чём проблема построить AST, ведь оно всё равно строиться компилятором?

Я не говорил, что исходники на Rust нельзя представить в виде sexp, я просто усомнился, что от этого повысится читаемость. Ну я вот не поленился, и перевёл пример на твой синтаксис (я взял на себя смелость добавить в некоторых местах скобок, чтобы избежать неоднозначностей), но получилось говно:

((struct :annotation (must-use "futures are lazy and do nothing unless consumed"))
 (Future :access pub
         :template ((T (+ Send (' static)))
                    (E (+ Send (' static)))))
 (core :access pub
       :value (Option :template ((Core :template (T E))))))

(impl :template ((T (+ Send (' static)))
                 (E (+ Send (' static))))
      (Future :template ((Option :template ((Tuple :template (T (Stream :template (T E))))))
                         E))
      (defun (to-stream :access pub) ((self :modifier ('mut)) :return (Stream :template (T E)))
        (stream:from-core (core-take (deref-mut (field self 'core))))))

(impl :template ((T (+ Send (' static)))
                 (E (+ Send (' static))))
      :trait Async
      (Future :template (T E))
      :assoc-types ((Value T)
                    (Error E)
                    (Cancel (Receipt :template ((Future :template (T E))))))
      (defun is-ready ((self :modifier ('ref)) :return bool)
        ;; Либо clojure-way: (.consumer-is-ready? (core:get (field (ref self) 'core))
        (call-instance-method (core:get (field (ref self) 'core))
                              'consumer-is-ready?)))

Код получился абсолютно нечитаемым. В отличие от Rust, где разнородные синтаксические элементы играют роль «якорей», за которых цепляется глаз, тут без вдумчивого разбора кода невозможно сказать, что делает тот или иной фрагмент, какими свойствами обладает тот или иной тип и т.д.

Хотя это кончено не то что надо, т.к. вообще говоря шаблоны в лисп-синтаксисе просто не нужны, т.к. есть макросы.

Вот с этого места поподробнее. Как макросы могут заменить дженерики?

<T: Send + 'static, E: Send + 'static>

просто режет глаз - в лиспе такие вещи просто делаются отдельной сущностью.

Ну и как подобные вещи делаются в лиспе? Поясню, этот фрагмент означает, что у типа есть два обобщенных параметра T, U, каждый из которых должен реализовывать трейт Send и иметь статическую продолжительность жизни.

Исходная версия theNamelessOne, :

Дальше мне просто лениво, но в чём проблема построить AST, ведь оно всё равно строиться компилятором?

Я не говорил, что исходники на Rust нельзя представить в виде sexp, я просто усомнился, что от этого повысится читаемость. Ну я вот не поленился, и перевёл пример на твой синтаксис (я взял на себя смелость добавить в некоторых местах скобок, чтобы избежать неоднозначностей), но получилось говно:

((struct :annotation (must-use "futures are lazy and do nothing unless consumed"))
 (Future :access pub
         :template ((T (+ Send (' static)))
                    (E (+ Send (' static)))))
 (core :access pub
       :value (Option :template ((Core :template (T E))))))

(impl :template ((T (+ Send (' static)))
                 (E (+ Send (' static))))
      (Future :template ((Option :template ((Tuple :template (T (Stream :template (T E))))))
                         E))
      (defun (to-stream :access pub) ((self :modifier ('mut)) :return (Stream :template (T E)))
        (stream:from-core (core-take (deref-mut (field self 'core))))))

(impl :template ((T (+ Send (' static)))
                 (E (+ Send (' static))))
      :trait Async
      (Future :template (T E))
      :assoc-types ((Value T)
                    (Error E)
                    (Cancel (Receipt :template ((Future :template (T E))))))
      (defun is-ready ((self :modifier ('ref)) :return bool)
        (call-instance-method (core:get (field (ref (self)) 'core))
                              'consumer-is-ready?)))

Код получился абсолютно нечитаемым. В отличие от Rust, где разнородные синтаксические элементы играют роль «якорей», за которых цепляется глаз, тут без вдумчивого разбора кода невозможно сказать, что делает тот или иной фрагмент, какими свойствами обладает тот или иной тип и т.д.

Хотя это кончено не то что надо, т.к. вообще говоря шаблоны в лисп-синтаксисе просто не нужны, т.к. есть макросы.

Вот с этого места поподробнее. Как макросы могут заменить дженерики?

<T: Send + 'static, E: Send + 'static>

просто режет глаз - в лиспе такие вещи просто делаются отдельной сущностью.

Ну и как подобные вещи делаются в лиспе? Поясню, этот фрагмент означает, что у типа есть два обобщенных параметра T, U, каждый из которых должен реализовывать трейт Send и иметь статическую продолжительность жизни.