LINUX.ORG.RU

Вышел язык программирования Racket 7.0

 , ,


4

3

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

Racket версии 7.0 включает существенные изменения в рамках долгосрочных целей замены текущей системы времени выполнения и поддержки множества систем времени выполнения. Предполагается, что пользователи Racket не почувствуют большой разницы между Racket 6.12 и Racket 7.0, но в связи с тем, что реализация претерпела серьёзные изменения, увеличен именно старший номер версии.

Ядро версии 7.0 является результатом переработки ядра версии 6.12 более чем на 1/8, и включает новый механизм раскрытия макросов, который осуществляет бутстрэппинг самого себя. Данный механизм покрывает более 40% кода, необходимого для замены ядра Racket на Chez Scheme. Остальные 60% кода, по бОльшей части, также реализованы, но не включены в этот выпуск; мы надеемся и предполагаем, что Racket-на-Chez будет готов для промышленного использования в следующих выпусках ветки 7.x

  • Синтаксис формы (`#'`) поддерживает новые шаблоны подформ: ~@ - для сплайсинга, и ~? - для выбора между подшаблонами, основанного на возможном «отсутствии» значения у переменных образца (например, у образца ~optional в syntax-parse). Библиотека syntax/parse/experimental/template, откуда происходят эти возможности, экспортирует новые формы под старыми именами для совместимости.
  • На Windows флаг --embed-dlls команды raco exe создаёт по-настоящему автономный исполняемый файл ".exe", который содержит в себе разделяемые библиотеки Racket.
  • Опция «Create Executable» интегрированной среды разработки DrRacket для учебных языков (Beginner Student, и т.п.) использует флаг --embed-dlls на Windows.
  • Поддержка prefab («previously fabricated») структур в Typed Racket существенно улучшена, что делает их более полиморфными, исправляя, вместе с тем, существенные ошибки текущей реализации. Программы, которые сейчас используют предикаты для prefab-структур неизвестных данных, могут нуждаться в ревизии, т.к. предыдущие версии Typed Racket позволяли программам с потенциальными ошибками осуществлять проверку типов. Смотрите Typed Racket RFC 1 и prefab-changes для более подробной информации об этом изменении, и о том, как исправить программы, которые подверглись влиянию в связи с этим изменением.
  • Typed Racket поддерживает #:rest-star в конструкторе типов ->*, что позволяет функциональным типам указывать в хвостовом списке аргументов (rest arguments) более сложные образцы типов, такие как функция hash.
  • Интерактивные оверлеи могут быть наложены на графики, созданные с помощью plot-snip. Это позволяет создавать интерактивные графики или отображать дополнительную информацию, когда указатель мыши находится над областью графика. Примеры использования данной возможности можно посмотреть тут.
  • racket/plot предоставляет процедуры для отображения графиков японских свечей (candlestick charts), которые могут быть использованы в финансовом анализе временных рядов.
  • Добавлен contract-equivalent?, который проверяет, что два контракта являются взаимосильными, без экспоненциального замедления, которое имеет место в случае двух вызовов contract-stronger?.
  • Lazy Racket поддерживает функции с именованными аргументами.

>>> Оригинал



Проверено: jollheef ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от monk

Например вот так можно добавить «без пробельную» арифметику:

>> 123+5*6
*** Syntax Error: invalid integer! at "123+5*6"
*** Where: do
*** Stack: load 
>> nums: charset [#"0" - #"9"]
== make bitset! #{000000000000FFC0}
>> ops: ["+" keep ('+) | "-" keep ('-) | "*" keep ('*) | "/" keep ('/) ]
== ["+" keep ('+) | "-" keep ('-) | "*" keep ('*) | "/" keep ('/)]
>> math: [ collect any [ ops | copy n some nums keep (to-integer n) ] ]
== [collect any [ops | copy n some nums keep (to-integer n)]]
>> parse "123+5*6" math
== [123 + 5 * 6]
>> do parse "123+5*6" math
== 768
loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от azelipupenko

CL тухнет с 1994 года
Никаких новых идей, ничего нового в самом языке не наблюдается
развитие само языка застопорилось

Не фанат лиспа (ровно наоборот), но это как раз таки показатель хорошего языка.

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

Какое-то реально заметное развитие (либо деградация) есть там, где язык изначально говно сам по себе, либо говённо спроектирован, либо же имеет ключевые недостатки, формурующие нездоровое разрозненное сообщество. Наглядные примеры — JS, который изначально был жутким неюзабельным днищем, а теперь его знатно перетряхнули и расширили, также Python, в котором попыткы (имхо, все фейловые) решения нескольких ключевых проблем привели к тому, что даже его создатель уже сам махнул на него рукой.

WitcherGeralt ★★
()
Ответ на: комментарий от loz

Что за Chez Scheme и зачем оно в ракете?

Реализация схемы с быстрым рантаймом, уровня которого сами рэкетиры запилить не осилили. Теперь рэкет будет не только фичастый, но и быстрый.

Virtuos86 ★★★★★
()
Ответ на: комментарий от WitcherGeralt

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

Смешно, вначале насоздавал проблем а потом пытаясь решить сам же и махнул рукой :D

loz ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Есть в этих рассуждениях рациональное зерно. И я во-многом согласен. С другой стороны, когда в сам язык не вносятся изменения почти уже четверть века, создаётся ощущение изоляции от всего остального мира. Не может быть такого, чтобы за 25 лет в языке нечего было изменить или доработать. Например, в языке нет даже потоков выполнения (трэдов или нитей, как их любят некоторые пользователи гугло-переводчика называть).

azelipupenko
() автор топика
Ответ на: комментарий от azelipupenko

Например, в языке нет даже потоков выполнения

На бумаге - нет, но де-факто bordeaux-threads уже давно стал стандартным апи для потоков. Наглядный, кстати, тебе пример эволюционного развития.

anonymous
()

а также первая в мире экосистема для языко-ориентированного программирования.

Подделка хипстеров. Ненужно.

Odalist ★★★★★
()
Ответ на: комментарий от Odalist

Подделка хипстеров. Ненужно.

У хипстеров хоть это есть своё :-) А что есть своё у тебя? :-)

azelipupenko
() автор топика
Ответ на: комментарий от Odalist

Подделка и поделка - два разных слова

dave ★★★★★
()
Ответ на: комментарий от azelipupenko

«достаточно одних только библиотек, новый стандарт не нужен»

Я такого не говорил. Речь шла о том, что реализация каких-либо расширений языка (да хоть даже полное его перелопачивание) не требует вмешательства в стандарт. Что касается обновления стандарта, то оно бы не помешало, но утвердить такие радикальные и местами спорные изменения, которые предлагает cl21, по-просту некому: сообщество децентрализовано да и врядли готово к потере обратной совместимости. Видимо, не набралась ещё критическая масса общепризнанных библиотек, которыми можно пополнить стандарт или вытеснить его части, чтобы матерые лисперы снова собрались и их утвердили на бумаге.

anonymous
()
Ответ на: комментарий от WitcherGeralt

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

А что за трогательная история с Гвидо?

dave ★★★★★
()
Ответ на: комментарий от anonymous

но де-факто bordeaux-threads уже давно стал стандартным апи для потоков. Наглядный, кстати, тебе пример эволюционного развития

Могу перечислить чего мне не хватило и из-за чего я ушёл на Racket.

1. Корутины/зелёные треды/генераторы.

2. Нормальные модули. В CL слишком много имён уже занято и нету возможности давать псевдонимы модулю в конкретном пакете.

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

2.3. С горем пополам можно сделать изнасиловав компилятор и среду выполнения (и поэтому никто кроме меня использовать не будет). 1. нереализуемо.

monk ★★★★★
()
Ответ на: комментарий от anonymous

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

Да? Из-за этого named-readtables работает только с ASCII, cl-cont жуткий тормоз, а проверка собираемости требует удаления .fasl, так как компиляция может менять состояние системы.

monk ★★★★★
()
Ответ на: комментарий от loz

do parse «123+5*6» math

Это не другой синтаксис. Так и на C++ можно.

Что-нибудь написать вместо #lang ..., чтобы выполнилось

#lang profj/full

class Example {
  static String result = null;
  public static void Main(String[] args) {
    result = "Hi";
  }
}

можно? Или хотя бы заставить его brainfuck компилировать, как сделано здесь?

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

cl-cont жуткий тормоз

Я не знаю, какой смелостью надо обладать, чтобы использовать такие библиотеки в реальных программах. Почему нельзя просто взять Racket, в котором отлично реализованы продолжения, и не писать на этом языке? Почти все недостатки CL устранили в Racket. Единственно, что CL отличает от Racket - это работка в образе, горячая замена кода - т.е. исследовательская работа. В остальном Racket выглядит куда более оптимистично. (Это не тебе, а так, просто к слову про cl-cont.)

azelipupenko
() автор топика
Ответ на: комментарий от anonymous

Да там же во всех тестах рэкет проигрывает лиспу от 2х до 6 раз по времени.

Там у лиспа (safety 0), а местами define-vop. Chez в 1.5-2 раза быстрее, чем Racket.

monk ★★★★★
()
Ответ на: комментарий от azelipupenko

Единственно, что CL отличает от Racket - это работка в образе, горячая замена кода - т.е. исследовательская работа.

Ещё declare type и очень мощный отладчик.

Правда с точки зрения разработчиков Racket это всё недостатки: работа в образе поощряет не писать тесты и создаёт невоспроизводимую среду, мощный отладчик поощряет забивать на проверку входных данных и писать программы, которые не понимает сам разработчик, declare приводит к тому, что тестируется и выполняется разные программы.

Кстати, работа в образе в PLT Scheme была. Выпилили где-то в 3 версии.

Теперь вместо образа и отладчика у нас Rackunit, а вместо declare — Typed Racket и Hackett.

monk ★★★★★
()
Ответ на: комментарий от monk

1. Корутины/зелёные треды/генераторы.

blackbird / series не смотрел?

2. Нормальные модули. В CL слишком много имён уже занято и нету возможности давать псевдонимы модулю в конкретном пакете.

Библиотеки вроде cl-package-aliases были давно, а сейчас вообще из коробки во всех (или почти всех) реализациях есть local nicknames у пакетов.

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

Если символ экспортирован из пакета, то он становится частью апи. Переопределили/перекрыл = ССЗБ. Никто же не отстреливает себе ноги из-за call-next-method в clos.

Если символ внутренний, то проблемы тем более нет.

anonymous
()
Ответ на: комментарий от azelipupenko

Почему нельзя просто взять Racket

Я не знаю, какой смелостью надо обладать, чтобы использовать такие языки в реальных программах.

anonymous
()
Ответ на: комментарий от anonymous

Да это очередной виртуал anonimous&C поехавший на непонимании лиспа. Вот и поливает CL как и den73 на каждом углу. Позитивной повестки нет.

anonymous
()
Ответ на: комментарий от anonymous

Их там гномики покусали?

Что они блджад с моим shootout-ом сделали? Все языки покастрировали. Где Chez Scheme, Chicken, GNU Guile, блджад? Где PyPy, блджад? Где LuaJIT, ёпта? Как хотя бы сравнить сабж с питоном, блджад, ёпта? Старая версия-то хоть где-то осталась?

anonymous
()
Ответ на: комментарий от azelipupenko

В остальном Racket выглядит куда более оптимистично.

Библиотеки-то уже появились? Что-нибудь уровня cepl и varjo или хотя бы просто обертка к sdl2 и опенгл

anonymous
()

Fun fact: «Chez Scheme» в русской раскладке выглядит как «Сруя Ысруьу».

anonymous
()
Ответ на: комментарий от anonymous

Я не знаю, какой смелостью надо обладать, чтобы использовать такие языки в реальных программах.

Ну какой? :-) Обычной :-) Ведь над Racket работают не 2,5 человека, как сами знаете где, а целая команда из представителей различных университетов США, в частности :-)

azelipupenko
() автор топика
Ответ на: комментарий от anonymous

Да это очередной виртуал anonimous&C поехавший на непонимании лиспа. Вот и поливает CL как и den73 на каждом углу. Позитивной повестки нет.

Позитивная повестка: вышел Racket 7.0! :-) Даже графики японских свечей можно рисовать :-) А вам ещё не надоело лишь только числа Фибоначчи рассчитывать? :-)

azelipupenko
() автор топика
Ответ на: комментарий от anonymous

Библиотеки-то уже появились? Что-нибудь уровня cepl и varjo или хотя бы просто обертка к sdl2 и опенгл

Всё в твоих руках :-)

azelipupenko
() автор топика
Ответ на: комментарий от anonymous

Возьмём активность сообщества. Достаточно сравнить активность в списках рассылки C++ или того же $борщнейм, как всё становится очевидно в пользу C++

А какой список рассылки есть у цепепе? :-)

azelipupenko
() автор топика
Ответ на: комментарий от anonymous

Что-нибудь уровня cepl и varjo или хотя бы просто обертка к sdl2 и опенгл

https://docs.racket-lang.org/sgl/index.html

https://docs.racket-lang.org/pict3d/index.html

https://docs.racket-lang.org/opengl/index.html

Пример использования: https://gist.github.com/tonyg/5425736

SDL2: https://github.com/cosmez/racket-sdl

GLSL: https://rosettacode.org/wiki/OpenGL_Pixel_Shader#Racket

monk ★★★★★
()
Ответ на: комментарий от monk

Это не другой синтаксис. Так и на C++ можно.

Это другой синтаксис, что подтверждает синтаксическая ошибка в моему примере.

Что-нибудь написать вместо #lang ..., чтобы выполнилось

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

Или хотя бы заставить его brainfuck компилировать, как сделано здесь?

Ну я вобщет это и показал, как левый код скомпилировать в код на Rebol и потом его запускать.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это Red просто потому что он под рукой есть, но на реболе то же самое будет.

loz ★★★★★
()
Ответ на: комментарий от monk

Слабовато. racket-sdl я видел и пять лет назад, ничем не лучше автоматом сгенерированных биндингов, но зачем-то написаны вручную. sgl - низкоуровневщина, даже до cl-opengl не дотягивает (gl-begin gl-end, шейдеры строковой переменной - серьезно? И это в метаязыковой-то платформе?) А pict3d, по-видимому, очередная курсовая уровня frtime. Кубик со сферой мож и нарисуешь, но на большее не хватит.

anonymous
()
Ответ на: комментарий от anonymous

blackbird / series не смотрел?

Ух ты, они воткнули в cl-async использование libuv! Правда там почему-то даже yield нету :-( Но всё равно большой шаг вперёд.

Библиотеки вроде cl-package-aliases были давно

Так-то да. Я свою тоже писал. Но в Racket более продумано. Есть возможность добавить любой префикс к импортируемым символам, переименовать их и т.д. Или например такой финт:

#lang racket
(require (prefix-in r: racket))

(define (list . args)
  (cons 'list (apply r:list args)))

;; здесь (list) уже мой, а r:list ссылается на системный

Если символ экспортирован из пакета, то он становится частью апи. Переопределили/перекрыл = ССЗБ

Вот, например, макрос:

(defmacro fwrite (stream x)
  `(aif ,stream (format it "~a" ,x) nil))

Угадай, почему поломается при использовании.

А то, что любое импортированное API нельзя переопределять даже локально, крайне неудобно.

Например,

(labels ((next ...)) (lib:foo ...))

может внезапно поломаться, так как iter экспортирует next, если lib:foo его использует при раскрытии, то кирдык.

Никто же не отстреливает себе ноги из-за call-next-method в clos.

Из-за call-next-mathod — нет, а из-за defmethod очень часто.

Например, есть библиотека

(defclass a () ...)
(defmethod foo ((a a) r) ...)

Кто-то пишет к ней расширение (вторая библиотека)

(defmethod foo ((a a) (r spec)) ...)

Теперь foo для второго аргумента с классом spec работает по-другому.

Затем кто-то другой расширяет изначальную библиотеку

(defclass b (a) ...)
(defmethod foo ((b b) r) ...)

Упс. Расширение не работает для объектов b.

monk ★★★★★
()
Ответ на: комментарий от monk

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

AlexM ★★★★★
()
Ответ на: комментарий от AlexM

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

Можешь whalesong использовать. Будет что-то вроде:

#lang planet dyoo/whalesong
(require (planet dyoo/whalesong/resource)
         (planet dyoo/whalesong/web-world)
         (planet dyoo/whalesong/js))

; This is a small demonstration of the Javascript
; graphics library Raphael from http://raphaeljs.com/ .

; The example below the bindings draws a Lissajous curve.


;;;
;;; Whalesong binding of Raphael
;;;
(load-script "http://yandex.st/raphael/1.5.2/raphael.js")

(define paper #f)

(define (raphael-init id width height)
  (unless paper    
    (set! paper
          (js-eval 
           (format "Raphael(~s, ~a, ~a)"
                   id width height)))))

(define (raphael-rect x1 y1 x2 y2 . more)
  (case (length more)
    [(0) (call-method paper "rect" x1 y1 x2 y2)]
    [(1) (call-method paper "rect" x1 y1 x2 y2 (car more))]
    [else (error 'raphael-rect "too many arguments")]))

(define (raphael-circle x y r)
  (call-method paper "circle" x y r))

(define (raphael-ellipse x y rx ry)
  (call-method paper "ellipse" x y rx ry))

(define (raphael-image src-uri x y w h)
  (call-method paper "image" x y w h))

(define (raphael-set)
  (call-method paper "set"))

(define (raphael-push set . elems)
  (for-each (О» (e) (call-method paper "push" e)) elems))

(define (raphael-text x y str)
  (call-method paper "text" x y str))

(define (raphael-path str) ; str in SVG path string format
  (call-method paper "path" str))

(define (raphael-line x1 y1 x2 y2)
  (raphael-path (format "M~a ~aL~a ~a" x1 y1 x2 y2)))

(define (raphael-clear) 
  (call-method paper "clear"))

(define (raphael-node c)
  (call-method c "node"))

(define (raphael-hide c)
  (call-method c "hide"))

(define (raphael-show c)
  (call-method c "show"))


(define (raphael-remove c)
  (call-method c "remove"))

(define (raphael-rotate c deg . more)
  (case (length more)
    [(0) (call-method c "rotate" deg)]
    [(1) (let ([is-absolute (car more)])
           (call-method c "rotate" deg is-absolute))]
    [(2) (let ([cx (car more)]
               [cy (cadr more)])
           ; (cx,xy) is the center
           (call-method c "rotate" deg cx cy))]))

(define (raphael-translate c dx dy)
  (call-method c "translate" dx dy))

(define (raphael-scale c xtimes ytimes . more)
  (case (length more)
    [(0) (call-method c "scale" xtimes ytimes)]
    [(2) (let ([centerx (car more)]
               [centery (cadr more)])
           (call-method c "scale" xtimes ytimes centerx centery))]
    [else (error 'raphael-scale "wrong number of arguments")]))

(define (raphael-attr c . more)
  (case (length more)
    [(2) (let* ([attribute-name (car more)]
                [attribute-value (cadr more)]
                [attribute-value (if (number? attribute-value)
                                     (number->string attribute-value)
                                     attribute-value)])
           (call-method c "attr" attribute-name attribute-value))]
    [(1) (cond
           [(string? (car more))
            ; return current attribute values
            (call-method c "attr" (car more))]
           [(list? (car more))
            (for-each (О» (p) (let ([name (car p)]
                                   [val (cadr p)])
                               (raphael-attr c name val)))
                      (car more))]
           [else (error 'raphael-attr "wrong argument type: string or list-of-two-element-lists expected")])]
    [else (error 'raphael-attr "expected 2 or 3 arguments")]))

;;;
;;; Demonstration of the Raphael bindings
;;;

(define WIDTH 400)
(define HEIGHT 400)

(define XMIN -1.0)
(define XMAX  1.0)
(define YMIN -1.0)
(define YMAX  1.0)

(define FRAMES-PER-SECOND 30)

(define SECONDS-PER-ORBIT 20)

(define STAR-PATH
  "M16,22.375L7.116,28.83l3.396-10.438l-8.883-6.458l10.979,0.002L16.002,
   1.5l3.391,10.434h10.981l-8.886,6.457l3.396,10.439L16,22.375L16,22.375z")

(define (count->time c)
  (let ([seconds (/ (remainder c (* SECONDS-PER-ORBIT FRAMES-PER-SECOND)) FRAMES-PER-SECOND)])
    (* 2 pi (/ seconds SECONDS-PER-ORBIT))))

(define screen-x
  (let ([dx (- XMAX XMIN)])
    (lambda (x)
      (let* ([x (max x XMIN)]
             [x (min x XMAX)])
        (/ (* (- x XMIN) WIDTH) dx)))))

(define screen-y
  (let ([dy (- YMAX YMIN)])
    (lambda (y)
      (let* ([y (max y YMIN)]
             [y (min y XMAX)])
        (/ (* (- (- y) YMIN) HEIGHT) dy)))))

(define-struct world (count star))

;;; See http://en.wikipedia.org/wiki/Lissajous_curve for
;;; other values of a and b to try.
(define a 5)
(define b 4)
(define c 3)

(define (x t)
  (* 0.8 (sin (* a t))))

(define (y t)
  (* 0.8 (sin (* b t))))

;; tick: world view -> world
(define (tick world view)
  (let* ([c (world-count world)]
         [s (world-star world)]
         [t (count->time c)]
         [t2 (count->time (sub1 c))])
    (cond
      [(zero? c)     
       (raphael-init "raphael_area" WIDTH HEIGHT)       
       (make-world 1 (raphael-circle (screen-x (x t)) (screen-y (y t)) 3))]
      [else
       (raphael-remove s)
       (let ([color (format "rgb(~a%, ~a%, ~a%)" 
                            (* 100 (/ (+ 1.0 (x t)) 2.0))
                            (* 100 (/ (+ 1.0 (y t)) 2.0))
                            50)])
         (raphael-attr (raphael-line (screen-x (x t2)) (screen-y (y t2)) 
                                     (screen-x (x t)) (screen-y (y t)))
                       "stroke" color)
         (make-world (add1 c)
                     (let* ([s (raphael-path STAR-PATH)]
                            [s (raphael-translate s 
                                                  (- (screen-x (x t)) 15)
                                                  (- (screen-y (y t)) 15))]
                            [s (raphael-attr s "fill" color)]
                            [s (raphael-rotate s c)]
                            [scale (+ 3 (* 20 (/ (+ 1.0 (sin (* 5 t))) 2)))]
                            [s (raphael-scale s scale scale)])
                       (raphael-attr s "stroke" "black"))))])))

;; draw: world view -> view
(define (draw world view)
  view)

(big-bang 
 (make-world 0 #f)
 (initial-view (xexp->dom '(html (head) (body (div (@ (id "raphael_area")))))))
 (on-tick tick (/ 1 FRAMES-PER-SECOND))
 (to-draw draw))
monk ★★★★★
()
Ответ на: комментарий от AlexM

И вебдваноль тянет всё на клиент именно из-за ущербности распространённых языков программирования. Проще браузер нагрузить. Для Racket такой необходимости в общем случае нет.

monk ★★★★★
()
Ответ на: комментарий от BitSum

А что, в оправдание коданию на цпп уже что-то придумали?

anonymous
()
Ответ на: комментарий от monk

Скажи, ты сам собрался все верстать на этом чудесном языке? Потому что я не вижу никакой возможности включить верстальщиков/фронтендеров в этот процесс. Кстати, вспомним арчимага, тот тоже носился с подобной мутью на CL, но жизнь заставила перейти на JS. Потому что сферический лиспер в вакууме не готов для продакшна, где всю работу физически невозмжно делать в гордом одиночестве.

anonymous
()
Ответ на: комментарий от monk

Это не другой синтаксис. Так и на C++ можно.

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

Я не уверен как с этим в ракете, но суть в том что в реболе у тебя есть полный контроль в рантайме над «программой» что ты можешь при запуске «дозагружать» код любыми доступными способами. Например ты можешь сделать бинарь внутри которого будет константная строка кода не на реболе и при старте твой собственный встроенный интерпретатор/компилятор пройдется по нему и сделает «рабочим».

Хз понятно написал или нет :)

loz ★★★★★
()
Ответ на: комментарий от loz

суть в том что в реболе у тебя есть полный контроль в рантайме над «программой»

В С++ так нельзя потому что у тебя нет возможности самостоятельно «загружать» файлы.

В C++ тоже можно загружать файлы в рантайме. В следующем семестре тебе может быть даже расскажут как, если ты пересдашь весеннюю сессию осенью.

anonymous
()
Ответ на: комментарий от anonymous

Потому что я не вижу никакой возможности включить верстальщиков/фронтендеров в этот процесс.

Я же написал: https://docs.racket-lang.org/web-server/templates.html

После этого в коде остаётся

...
(define (render-blog-page request)
  (define (response-generator embed/url)
    ;; поля для шаблона
    (define insert-url (embed/url insert-post-handler))
    (define posts (render-posts))
    (response/xexpr
      (include-template "render-blog-page.html")))
  (define (insert-post-handler request)
    (blog-insert-post!
     BLOG (parse-post (request-bindings request)))
    (render-blog-page request))
 
  (send/suspend/dispatch response-generator)))

(define (render-post a-post)
  (include-template "render-post.html"))
...

monk ★★★★★
()
Ответ на: комментарий от anonymous

Скажи, ты сам собрался все верстать на этом чудесном языке? Потому что я не вижу никакой возможности включить верстальщиков/фронтендеров в этот процесс

Свои два сайта, на которых был нужен дизайн, я верстал именно на этом чудесном языке. Дизайнер набрасывал прототип, я прототип парсил в макет на Racket и разбивал на функции.

monk ★★★★★
()
Ответ на: комментарий от anonymous

10е правило Гринспена стали преподавать в университете?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.