LINUX.ORG.RU

Racket завершает переход с LGPL на двойное лицензирование MIT/Apache

 , ,


1

2

Racket — язык, вдохновленный Scheme, а также экосистема для программирования других языков — начал переход на двойное лицензирование Apache 2.0 или MIT в 2017 году и теперь, к версии 7.5, практически все его компоненты завершают этот процесс.

Авторы отмечают две основные причины этого:

  1. Непонятно, как трактовать положения LGPL о динамической линковке к Racket, где макросы «копируют» код из библиотек в код приложения, а приложения зачастую комплектуются рантаймом и библиотеками Racket.
  2. Некоторые организации принципиально не хотят использовать программное обеспечение, лицензированное под любой вариацией GPL.

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

>>> Подробности



Проверено: a1batross ()
Последнее исправление: filosofia (всего исправлений: 2)

Ответ на: комментарий от arturianec100

мои 5 копеек:

когда появились парсеры обрабатывающие не скобочный код в структуры Лиспа

Покажи хоть один, а лучше все.

  • Dylan, D-expressions
  • infix notation в Scheme, CL отдельной библиотекой. есть SFRI в Guile реализованный
  • MOON от David Moon, лисп с питонячьим синтаксисом. исходники непонятно где, но судя по утилите которая генерирует из markdown html+svg для sequence diagram UML, например – реализация где-то существует
  • питонячий синтаксис в CL, scheme какой-то библиотекой. readable Sexpressions, вроде бы
  • самописный на основе ANTLR. начиная с 2.7 ANTLR умел генерировать pretty printing AST дерева в Sexpressions. точно есть в v3, и в современном v4 (в котором можно писать леворекурсивные грамматики, сам ANTLR v4 попытается её факторизовать, что в v3 и ранее нужно было делать вручую). к тому же, есть StringTemplate которыми можно настроить pretty printer в другой любой удобный синтаксис.
  • ракетка, конечно. примеры DSL выше
  • Tree PEG, если это дерево в скобочные структуры приводим вручную
  • самописный на основе например Nim + PEG parser + AST макросы или D + Pegged для PEG парсера + AST CTFE макросы
  • самописный на основе Stratego/XT и abnf оттуда. возможности примерно как у Xtend/Xtext
  • самописный на основе Xtend/Xtext в Eclipse EMF

может кто-то ещё пополнит список?

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

по ссылке не просто BNF, а ещё например синтаксическая раскраска и поддержка отладчиком.
то есть, это более IDEйное. например, JetBrains MPS или Xtend/Xtext, тот же Stratego/XT – это DSL, с редактором и проверкой корректности.
а yacc/BNF/самописный – не совсем, ибо всего этого нет «из коробки». хотя например в ANTLR есть графический отладчик грамматик и тот же StringTemplate или простая распечатка всего AST в Sexprs «из коробки», ну то есть ANTLR таки более DSLен, чем yacc/abnf/AST1/PEG парсер «на коленке».

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

опять же, все эти #lang foobar в ракетке более модульны и составимы. DSL в схеме вообще более модульны ибо гигиена, datum, syntax object, вот это вот всё. а тот же yacc *.y например edsl в лапшу из C кода, где модульностью и не пахло.

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

Конечно можно лучше и выше примеры этому были. Просто я привёл пример на плюсах который очень похож на «а мы сделали ДСЛ на лишпе».

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

Начинающие как раз «пишут на языке». Это для тебя опытного язык — это инструмент, а для неофита шаг в сторону — растерялся.

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

Выше и на плюсах приводили примеры которые лучше твоего лишпо-дсл.
Но ведь лишпо-элитариям так хочется оставить за собой последнее слово, да?
Не очень получилось. Давай ещё попытку.

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

Да, второй вариант выглядит лучше.
Но те 120 строк, насколько я вижу, не занимаются валидацией HTML.
Так что реализация немного не полноценна.

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

Они этого не учли/не знали когда первоначально выбирали LGPL? Ну, вот теперь у них есть разработчики которые принципиально не хотят кодить под MIT. Что такого случилось что они развернулись к разработчикам задом, а к организациям передом?

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

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

Нет, были неясности с линковкой. CDDL в этом плане менее ограничивающая.

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

LGPL мешала, так как были юридические неясности по поводу лицензирования разрабатываемого на языке кода

ШТААА

hobbit ★★★★★
()

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

Вот, а после этого сторонников GPL ещё фанатиками называют, лол.

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

Во втором варианте строка не обязана содержать HTML, там может быть какой угодно текст. Валидировать HTML можно, скормив его стороннему парсеру. И мне больше нравится первый вариант, потому что там сразу видна структура документа, представление списками проще для манипулирования, и в нём сложно получить невалидный HTML. Второй вариант выглядит как обычная html-лапша. Даже racket style, в котором больше скобочек, лучше.

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

C c++: динамическая типизация.

Со всеми: вычисления с формированием кода во время компиляции, контракты на значения, изолированная компиляция модулей (испортить чужой модуль невозможно).

Продуманные стандартные библиотеки. Например, в вебе можно такое:

#lang racket
(require web-server/servlet web-server/servlet-env)

(define ((phase f) request)
  (define (response-generator embed/url)
    (response/xexpr
     `(html
       (body (h1 "Phase 1")
             (p ,(read-line f))
             (a ((href ,(embed/url (phase f))))
                "next line")))))
  (send/suspend/dispatch response-generator))

(serve/servlet (lambda (req) (phase (open-input-file "/etc/passwd")) req))

Для каждой сессии открывается файл и этот файл передаётся аргументом в функцию, являющуюся обработчиком ссылки. При этом не надо париться с куками, менеджерами сессий, хранилищами данных. Просто в ссылку передаётся открытый файл. Также можно передавать любые другие данные.

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

Вот же больные религиозные фанатики.

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

С учётом того, что Racket позиционируется в первую очередь как язык для обучения, это почти критично.

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

во-вторых компилятору или интерпретатору это не нужно. гцц вообще под gpl и ничего.

Ну да. Только с исключением почти для всех библиотек из своего состава: libgcc, libstdc++, libfortran, libgomp, libdecnumber, libgov, …

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

Ой вэй.
Т.е. единственный «дсл» который в лиспо-языках создать можно, это языки с синтаксисом лиспа?
Всё ещё намного хуже чем я думал.

Что тогда некоторые воротят нос от плюсов? Вон пример такого-же дсл на плюсах приводил.
Но никто же не кичится созданием таким образом дсл на плюсах.

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

Те же Haskell или Rust без неё прекрасно обходятся, и её отсутствие никак кодогенерации не мешает.

Кодогенерации не мешает. Добавлению новых синтаксических конструкций мешает.

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

Т.е. единственный «дсл» который в лиспо-языках создать можно, это языки с синтаксисом лиспа?

Нет. Можно и такой:

val copy = fun(recur,from,to) {
  val files = contents(from);
  for f in files do {
    val source = lookup(from,f);
    if file?(source) then {
      val target = create-file(to,f);
      write(target,read(source));
    } else if dir?(source) /\ recur then {
      existing = lookup(to,f);
      dir = if sys-error?(existing) then create-dir(to,f) else existing;
      copy(recur,source,dir);
    };
  };
};

(c) https://github.com/HarvardPL/shill/blob/master/examples/copy/copy.cap

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

Но никто же не кичится созданием таким образом дсл на плюсах.

Кичатся. Например, когда когда сравнивают плюсы с Си (хотя на Си тоже можно сделать неплохие DSL типа libcello).

Преимущество лиспов в том, что во время компиляции можно не только генерировать код.

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

которые и против профсоюзов выступают?

А что, профсоюзы в современном мире – это не бесполезная бюрократия, которая скачет на кукане капиталистов?

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

Например, когда когда сравнивают плюсы с Си (хотя на Си тоже можно сделать неплохие DSL типа libcello).

Ну для лисперов libcello может быть и неплохой eDSL (много скобок, GC, не нужно его реально использовать, достаточно того, что он есть), но для сишников это просто корявая игрушка, которую никто в здравом уме не вставит в рабочий код. Достаточно просто потыкать ее несколько минут, чтоб понять всю ущербность и неприменимость этого нагромождения костылей.

Преимущество лиспов в том, что во время компиляции можно не только генерировать код.

Когда ты последний раз пользовался этим преимуществом?

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

Какие синтаксические конструкции были добавлены в лиспах, например?

Common Lisp: defclass, defmethod, with-transaction, …

Racket: весь Typed Racket (типизированные версии define, let, …), match, define/contract, …

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

но для сишников это просто корявая игрушка, которую никто в здравом уме не вставит в рабочий код

Понятно, что игрушка. Просто пример, что DSL на нём писать можно.

Когда ты последний раз пользовался этим преимуществом?

Несколько лет назад. Также, как и обработкой исключений и FFI. Будешь из этого делать какие-то выводы?

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

Просто пример, что DSL на нём писать можно.

Отвратительный пример. При том, что на С действительно можно писать eDSL, особенно на GNU C, который используется в Cello. К примеру, можно написать привязку к Python C API и писать так:

 
var a = List( 1, 2., "3", ByteArray( "ABC" ) ); 

Причем тут будет и RAII с автоматическим подсчетом ссылок, и вывод типов с автоматическим конструированием объектов. В то время, как на Cello это:

var i0 = $(Int, 5); 
var i1 = $(Int, 3); 
var i2 = $(Int, 4); 
var items = new(Array, Int, i0, i1, i2); 

Вообще практически любой ЯП реализованный на С - уже eDSL со своей системой типов. Остается только прикрутить к нему чуть-чуть юзабилити для использования из под С. Но опять же - зачем?

Несколько лет назад.

Для чего?

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

Я, конечно, не спец по лишпу, но это всё выглядит как просто функции.

(defmethod withdraw ((account (eql *account-of-bank-president*)) amount)
  (let ((overdraft (- amount (balance account))))
    (when (plusp overdraft)
      (incf (balance account) (embezzle *bank* overdraft)))
  (call-next-method)))

Какие аргументы у «функции» defmethod?

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

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

Julia как и лисп поддерживает гомоиконность, метапрограммирование, DSL и не надо будет усираться с этими скобочками.

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

Для чего?

GObjectIntrospection — интроспекция во время компиляции, в код подставляется уже функция с правильными типами и аргументами.

Преобразование однобайтных кодировок. При компиляции iconv формирует массив для используемой комбинации, дальше подстановка по массиву. Если преобразуется константа, то это происходит сразу при компиляции.

Ещё экспериментировал с созданием при компиляции классов по структуре базы данных.

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

Я, конечно, не спец по лишпу, но это всё выглядит как просто функции.

Технически макросы это и есть функции. А дальше уже вопрос религиозный как считать, это новый синтаксис или все те же списки, которые читают списки и на их основании создают новые списки. Но справедливости ради, на лиспах действительно можно писать DSL, которые визуально отличаются от стандартного синтаксиса. Хотя это исключение из правил, и зачастую это недоделанная демонстрнация возможности, а не полноценное и готовое к использованию решение.

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

Какие аргументы у «функции» defmethod?

Первый — withdraw, второй — ((account (eql *account-of-bank-president*)) amount), третий — всё что осталось.

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

Технически макросы это и есть функции.

Я к этому и клоню.

А дальше уже вопрос религиозный как считать, это новый синтаксис или все те же списки, которые читают списки и на их основании создают новые списки.

Я вообще не уверен, что у лиспа есть синтаксис как таковой. Это же голое AST.

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

Первый — withdraw

И результатом этой функции является компиляция функции с именем withdraw? Тогда и try/catch и class в С++ – это тоже функции?

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

Я к этому и клоню.

А макросы Си тоже функции?

Я вообще не уверен, что у лиспа есть синтаксис как таковой. Это же голое AST.

Если бы было AST, там были бы только идентификаторы, литералы и скобки. А на практике

(cons #(1 2) `(4 5 ,(+ 89 7) ,@(list 4 5 #S(foo 'ok))))

Иначе можно про любой язык программирования утверждать, что он «голое AST» (в Си просто скобок 3 вида, вот и вся разница).

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

Т.е. единственный «дсл» который в лиспо-языках создать можно, это языки с синтаксисом лиспа?

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

Вон пример такого-же дсл на плюсах приводил.

Там за Data, Attrs и std::string структуры не видно. Слишком много служебных слов на единицу полезной информации. Попробуй набрать так страничку.

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

Julia как и лисп поддерживает гомоиконность, метапрограммирование, DSL и не надо будет усираться с этими скобочками. Julia переводит твой код в внутренний лисп-код. Причём недавно вышла стабильная версия языка 1.0

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

Там за Data, Attrs и std::string структуры не видно.

Это вопрос конкретной реализации.
А как пример что на плюсах можно в таком же стиле создавать дсл вполне подойдёт.

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

GObjectIntrospection — интроспекция во время компиляции, в код подставляется уже функция с правильными типами и аргументами.

Имеется ввиду генерация байндингов, чтоб потом вызывать конкретные заранее известные функции? Если да, то обычно такие обвязки генерируют заранее, а не при каждой компиляции.

Преобразование однобайтных кодировок. При компиляции iconv формирует массив для используемой комбинации, дальше подстановка по массиву. Если преобразуется константа, то это происходит сразу при компиляции.

«Однобайтная строка»_koi8 можно и на С++ сделать. Массив для этого не обязательно каждый раз генерировать, а преобразование в compile time есть.

Ещё экспериментировал с созданием при компиляции классов по структуре базы данных.

Т.е. схема меняется и сразу ломается весь написанный под нее код? А если БД накрылась, то программа превратилась в мусор? Обычно ORM подразумевает обратный процесс, схема автоматически генерируется и обновляется на основе классов.

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

Julia как и лисп поддерживает гомоиконность, метапрограммирование, DSL и не надо будет усираться с этими скобочками. Julia переводит твой код в внутренний лисп-код.

А у меня нет проблем со скобочками, я умею их читать. Мне со скобочками даже лучше. А так да, язык интересный, я бы пощупал его, но сейчас мне будет тяжело найти время — полно других тем для исследований.

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

О да, совершенно верно. Синтаксис макросов в Julia просто от Бога. Как это лисперы сразу до такого не додумались в свои 60-80е, глупыши. Правда есть ещё один язык, с ещё более гомоиконным синтаксисом, и поэтому ещё более божественным синтаксисом для макросов - это Rust. Даже не знаю в каком из них лучше погрузиться в пучины метапрограммирования, ведь оно в обоих так естественно и необходимо(?)

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

Технически макросы это совсем не функции, макросы это даже не объекты(в любом языке с макросами). В писпе и скимах на маросах можно делать произвольный синтаксис, даже без ридеров, только от одного взгляда на реализацию, особенно в схеме может и прихватить. Поэтому, если у вас не html или хер знает какой ещё вложенный формат который так и ложится на s-выражения, то можно подумать и о парсинге.

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

Технически макросы это совсем не функции

Технически, в лиспе, макросы — компайл-тайм функции. Не больше, не меньше.

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

Вот теперь всё стало на свои места, пойду вызову макрос через apply схеме, а потом получу указатель на макрос в Си. Макросы - это директивы. Это технически. А как называется функционал произвольной макросистемы или препроцессора не имеет никакого значения в контексте семантики языка.

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

Не увидел пример встраивания дсл в код. Оно возможно?

В разных модулях. То есть в соседнем файле будет

#lang racket
(require "copy.cap")
...
(copy $t from to)
monk ★★★★★
()
Ответ на: комментарий от Serral

Если да, то обычно такие обвязки генерируют заранее, а не при каждой компиляции.

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

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

и после этого в модуле Gst доступны функции из текущей версии Gst. Но разбор описания приходится делать или при каждом запуске программы для всех функций или при каждом вызове функции.

«Однобайтная строка»_koi8 можно и на С++ сделать. Массив для этого не обязательно каждый раз генерировать,

И как его сделать?

char* iso8859_5_to_koi8[256] = ...

что написать вместо …? Вбить вручную 256 чисел? Я понимаю, настоящему сишнику и 10000 значений в исходники вбить не сложно. Но макросами это удобнее.

На самом деле, всё, что можно сделать макросами, можно сделать и внешним генератором кода на стадии make. yacc, bison, регулярные выражения, … Всё это в лиспе можно интегрировать в программу.

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

пойду вызову макрос через apply схеме

А в Common Lisp можно: (apply (macro-function ’bar) …)

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