LINUX.ORG.RU

Выход mocl

 , ,


7

8

mocl — набор инструментов для разработки на Common Lisp под мобильные платформы iOS и Android. По заверениям разработчиков получаемый код (используется LLVM) по производительности значительно превосходит аналогичный на Java/Dalvik.

В основе mocl лежит идея, заключающаяся в том, что логика приложения должна быть полностью описана на Лиспе, а пользовательский интерфейс — быть «родным» для платформы. Авторы проводят аналогию с Вэбом, когда логика серверного приложения описана на одном языке (например, на Лиспе), а представление — на другом (HTML + JavaScript).

Цена лицензии варьируется от $1299 для серьёзных компаний до $199 для индивидуальных разработчиков. Также предусмотрена «Source code license» для особых энтузиастов, доступ к которой, по-видимому, дают после обращения в службу поддержки.

Пример приложения на Github.

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

★★★★★

Проверено: mono ()
Последнее исправление: Dendy (всего исправлений: 4)

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

Фантастика. Как же это у тебя формат документов не ломает рабочий код - рабочему коду вообще до лампочки что там лежит в докментах? Он у тебя наверное ничего не делает.

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

Шоб тебе зарплату по такой бухгалтерии платили.

А я сам себе зарплату плачу, сколько надо — столько и заплачу.

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

Хех. Были уже треды про это.

Зимой, емнип, был годный макросрач CL vs Racket

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

Следовательно, расширять документы можно (и это не сломает работающую систему

А с чего бы ему ломаться?

но вот изменять строго заданные старые поля — нельзя. Валидация не пройдёт.

Да ладно тебе! Меняешь схему — и все прекрасно работает. Исключение — очень специальные поля, которые: 1. есть в количестве не более 5 штук; 2. никогда не изменяются и необходимость такая не вожникает; 3. выполняют важную, но вспомогательную роль и 4.это всё задокументировано, все это прекрасно знают и ни один дурак не будет менять поле ID на что-либо другое.

Изменить схему — всяко проще, чем код

upd: в самом крайнем случае задействуем на полную катушку механизм наследования:

schem['di']=schem['id'];

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

А с чего бы ему ломаться?

Я об этом и говорю, что не с чего.

Да ладно тебе! Меняешь схему — и все прекрасно работает. Исключение — очень специальные поля, которые: 1. есть в количестве не более 5 штук; 2. никогда не изменяются и необходимость такая не вожникает; 3. выполняют важную, но вспомогательную роль и 4.это всё задокументировано, все это прекрасно знают и ни один дурак не будет менять поле ID на что-либо другое.

Ну да. Но если у кого навязанная маркетинговым bullshit'ом хачкеля паранойя, то можно и огородиться.

Изменить схему — всяко проще, чем код

Да.

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

А почему считаешь, что решение не удачное? Что с funcall'ом не так?

В lisp-2 с функолом все ok. Другой вопрос - все ли ok с lisp-2 :) Но мои аргументы против будут достаточно известны: неудобство работы с HOF и вообще писанины в функциональном стиле, кроме того - я вообще не вижу причин для раздельного пространства имен функций и переменных кроме как для обеспечения нормальной работы CL-стайл макросов.

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

А в чём заключается неудобство?

Синтаксическая перегруженность при передаче ф-ций как аргументов

Как бы ты хотел?

Lisp-1 на данный момент меня устраивает.

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

Я об этом и говорю

А я и не спорю, я искренне удивляюсь.

Но если у кого навязанная маркетинговым bullshit'ом хачкеля паранойя, то можно и огородиться.

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

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

Гг. Ну я дальше по треду признал, частично, что неправ :)

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

Некоторые господа и я выдвинули тезис, что самое удобное на сегодняшний момент МП — МП Lisp. Ты попытался опровергнуть этот тезиз и привёл несколько раз ссылку на описание скаламакросов.

Неверно.
dave Полноценные статически типизированные макросы еще ни у кого не получились, насколько мне известно.... Scala нет нетипизированных макросов, без которого сама идея макросистемы не особо жизнеспособна...
Lisp-style макросы и динамическая типизация - вещи взаимосвязанные.

tailgunnerТак звучит более правдоподобно (хотя всё равно неизвестно, правда ли).

aliencasterНе существует примеров подтверждающих обратное. Появятся - поговорим.

rscalamacros.org

Далее ты привел dict-bind, которую в скале делать макрой просто не надо, чтобы доказать что скальные макросы фигня.

rя к чему: dict-bind через макру - это лиспопроблемы, в скале есть специальные средства для различного рода деструкций, и никто их через макру делать не будет. Если уж что сравнивать так это то что и там и там будет делаться через макру.

dict-bind хорошо демонстрирует основы МП и кодогенерацию

Нет - он демонстрирует лиспорешение лиспопроблем.

Ты же, в свою очередь, привёл мандулу которая ничего не генерирует и не делает неявного связывания

То есть основное условие сравнения с лиспом - надо все чтобы было как в лиспе? Ты серьезно?

Это конечно круто, но ни ADT, ни pattern matching не решают поставленной задачи о деструктуризации словаря.

Да ты наверное ослеп:
Выход mocl (комментарий)

Ты показал regexp'ы и ADT, а это совершенно не то что нужно.

Я показал тебе их как ответ парижу что можно показать кучу других свойств в скале которые на лиспе не сделаются так же как «dict-bind» поскольку ты начал сыпать макрами, пропустив предложение бболее корректной постановки задачи чем «а сделай на скале как в лиспе».

Ты не показал, как pattern matching разбирает именно словарь.

Еще раз:
Выход mocl (комментарий)

Далее протечка продлжилась и ты заявил, что подобная деструктуризация вообще не нужна, ибо решает некие частные случаи.

Именно. Потому что все представленные деструктуризации a) результат исходных хреновых решений передавать словарем то что словарем передавать не надо (и заметил что здесь пахнет объектным перлом на хэшах), и б в общем случае не решается потому что ключи в хешах в общем случае отфонарны, и соответствие их переменным в скоупе - это частный случай частного случая. На что ты предложил посмотреть как в кложуре используется :as. Но в тоже время то что переменные не имеют отношения к ключам в моем решении тебе не нравится.

Когда мы увидим разбор _словаря_ c неявным связванием идентификаторов механизмами Scala?

Когда ты объяснишь что именно ты хочешь показать?

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

И она с этой задачей справляется. А сраловский pm — нет.

Ты что - слепой?

scala> val List(a,b,c) = List(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3
r ★★★★★
()
Ответ на: комментарий от BooBoo

И уже на протяжении нескольких дней пытаюсь выбить из тебя реализацию подобной функциональности на Scala.

Ослеп?

Выход mocl (комментарий)

Ты же только вертишь задком и протекаешь, вместо того чтобы показать как это сделать.

Я тебе на первой же странице показал. У тебя с глазами как?

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

Понимаешь ли ты, что ADT в понимании ФЯП'ов в CoffeeScript вообще нет. CoffeeScript — вообще не ФЯП.

ADT к функциональщине имеет просто никакое отношение.

Чё, плохо что-ли?

То есть факт - у него захардкоженый вариант разбора трех структур. Все. Путтерн матчинг он не умеет. Его деструкция полуюзабельна именно по причине того что нет паттернматчинга. А нужна именно потому что там бдный выбор структур - даже таплов нет. вот и приходится «гетерогенные» списки деконструировать.

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

Если «писать работающие программы» — это долбиться с типами и невменяемым дизайном Scala, вместо того чтобы непосредственно решать задачу, то у меня для тебя плохие новости.

«долбится с типами», «невменяемый». Продолжайте - вы кладесь аргументов и обоснованного мнения в пользу динамических языков.

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

Лучше покажи, как же это у тебя формат документов ломает рабочий код?

Хотя нет, лучше просто расскажи, не показывай, а то я все равно со страху глаза зажмурю.

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

Деструктуризация не более чем демонстрирующий пример.

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

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

Итак, начнём сначала.

Что - опять трудности с чтением?


«На вход прилетает JSON». Кто будет укладывать json в твои классы? Одерски?

lift-json например (https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/).

На вход прилетсяет XML в CoffeeScript. Кто будет вкладывать его в кофейные объекты?

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

И если говорить о расширении документов,

Ты просто кладесь частных случаев.

«а пускай у нас только такие ихменения которые ничего не поломают».

Ну так ничего и не поломается в скале.

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

Так звучит более правдоподобно (хотя всё равно неизвестно, правда ли).

Звучит что именно - «Lisp-style макросы и динамическая типизация - вещи взаимосвязанные»? Я немного подумал и решил, что типизация макросов не очень важна, если сгененрированный код проверяется тайпчекером. В конце концов, худшее, что может случиться - невнятные сообщения об ошибках.

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

Лучше покажи, как же это у тебя формат документов ломает рабочий код?

Лучше покажи как это у тебя формат входных данных не имеет значения. Если так - то входные данные для программы явно избыточны, раз не влияют на результаты.

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

Кстати на счет макросов в Scala, раз уж меня помянул :)

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

Вообще говоря, нужны не просто продолжения, а их обобщение в виде вычислительных выражений как в F#. Но сдается мне, что Scala имеет ряд (фатальных??) недостатков в дизайне, которые будут мешать такой реализации. Один из них - возможность поставить return (в смысле java) в любом месте внутри метода. Из той же песни - break. Еще for comprehension сильно не стыкуется. По иронии судьбы этот comprehension призван решать похожую задачу, но здесь он будет здорово мешать.

В общем, это основные причины, по которым я забил на Scala. Боюсь, что исправить Scala будет уже поздно. Она теперь будет такой, какая она есть сейчас.

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

Ты что - слепой?

scala> val List(a,b,c) = List(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3

Лалка :) Это ж list, а не словарь. Кто-то из нас двоих действительно ослеп и это не я.

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

«а пускай у нас только такие ихменения которые ничего не поломают»

Очаровательно! ib4: echo $TXT | md5sum f6a1bbdbc65312c1d3bcb070a7ab103d -

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

Лучше покажи как это у тебя формат входных данных не имеет значения

Я смотрю, ты неравнодушен к базвордам. Вот тебе еще один: data driving

upd: кстати, методика описана у финнов.

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

В конце концов, худшее, что может случиться - невнятные сообщения об ошибках.

Как в CPP. Угу.

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

lift-json например

Кодом, пожалуйста, кодом. А не ссылками. Мне интересно, что нужно написать, чтобы эта штука сложила определённый выше json в определённые тобой объекты.

На вход прилетсяет XML в CoffeeScript. Кто будет вкладывать его в кофейные объекты?

xml2json сложит сам.

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

Лалка :) Это ж list, а не словарь. Кто-то из нас двоих действительно ослеп и это не я.

Лапка ты сам не читаешь что пишешь?

Хотел показать, что её задача декларативно разбирать словари и списки. И она с этой задачей справляется. А сраловский pm — нет.

словари и списки
списки

Со словарем ссылку выше дал раз пять.

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

В конце концов, худшее, что может случиться - невнятные сообщения об ошибках.

Как в CPP

В Си++ не макросы, а примитивная текстовая подстановка.

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

Один из них - возможность поставить return (в смысле java) в любом месте внутри метода.

В макру приходит AST. Можно ругнуться на стадии компиляции.

В общем, это основные причины, по которым я забил на Scala.

То что там работают продолжения и реализованы они не макрой?

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

Да ты наверное ослеп: Выход mocl (комментарий)

Как я понял BooBoo хочет малость не это. Что-то вроде:

val Dict(('a, av1), ('b, bv2)) = Map('a -> 1, 'b -> 2)
Ну или чтобы от порядка не зависеть:
val Dict(('b, bv1), ('a, av2)) = Map('a -> 1, 'b -> 2)
Ну и от количества элементов словаря тоже:
val Dict(('a, av1), ('b, bv2), _ ...) = Map('a -> 1, 'b -> 2, 'c -> 3, 'd -> 4)
// Под _ ... подразумевается 0 или более элементов словаря не имеющих значения. Как это в Scala выглядит я не знаю.

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

Кодом, пожалуйста, кодом. А не ссылками.

По ссылке код.

Мне интересно, что нужно написать, чтобы эта штука сложила определённый выше json в определённые тобой объекты.

По ссылке _именно это_ и показано.

xml2json сложит сам.

Кодом сестра кодом.

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

Как я понял BooBoo хочет малость не это.

scala> val map = Map('a -> 1, 'b -> 2, 'c -> 3)
scala> implicit class RichMap[K,V](map: Map[K,V])  {  def byKeys(ks: K*) = ks.map(k => map.getOrElse(k, null.asInstanceOf[V])).toList }

scala> val a :: c :: Nil =  map.byKeys('a,'c)
a: Int = 1
c: Int = 3

scala> val a :: rest =  map.byKeys('a,'c)
a: Int = 1
rest: List[Int] = List(3)
r ★★★★★
()
Ответ на: комментарий от r

Нет. Не нравится то, что в Scala, скорее всего, не получится добавить нормальный аналог вычислительных выражений по типу F#, а они мне нужны именно в Scala. Если бы был такой синтаксический сахар (по типу нотации do из Haskell), то тогда бы на фиг в Scala не нужны были бы ни текущие корявые продолжения, ни какой-то неполноценный for comprehension. Это та вещь, где Дон Сайм явно переиграл Мартина Одерского.

Я думаю, что в статически типизированных языках будущего обязательно будет аналог вычислительных выражений. К тому же, они много проще, чем нотация do из Haskell.

В общем, я жду появления нового языка. Существующие меня не устраивают. Даю поблажку только для Common Lisp.

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

И все же, ты откроешь секрет, что нужно сделать, чтоб изменения формата данных сломали код?

Как только ты пояснишь что такое «сломали код». В слова я играться не буду.

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

что нужно сделать, чтоб изменения формата данных сломали код?

Изменить тип поля, скажем, с int на string. Что, так никто никогда не поступает, а тот, кто поступает - ССЗБ? «Я знал, что ты скажешь это» (ц)

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

Ослеп? www.linux.org.ru/news/commercial/9298028?cid=9326673 (комментарий)

Какашка твоё решение. Это вообще не решение. Интересует неявное связывание путём генерации кода (ну а коль уж есть крутой pm, то сделай при помощи него). Но только словарей (hash table в Scala) и без всяких toList, лалка. А так как ты пукнул, так любой может сделать:

(defun yoba (ht)
  (iter (for (k v) in-hashtable ht) (nconcing (list k v))))

(destructuring-bind (k1 v1 k2 v2) (yoba (plist-hash-table '(:a 1 :b 2)))
  (list k1 v1 k2 v2))
; (:A 1 :B 2)

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

Как только ты пояснишь что такое «сломали код»

Действительно. Был не прав. Но я, кажется, знаю как все исправить! Давай зададим вопрос непосредственно автору этого термина: Выход mocl (комментарий)

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

Какашка твоё решение. Это вообще не решение.

Это звездец какие аргументы.

Интересует неявное связывание путём генерации кода

Кого - тебя? Меня не интересует.

ну а коль уж есть крутой pm, то сделай при помощи него).

Плять, а я с помощью чего по твоему сделал?

А так как ты пукнул, так любой может сделать:

А не пошел бы ты жопу лапка. Сначала научись аргументировать без лохства пукнул и прочих какашек - потом приходи.

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

Давай зададим вопрос непосредственно автору этого термина:

Автор этого термина - втор поста на который отетом ыл пост по твоей ссылке.

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

Ну так ты уточни у него, что он имел в виду, а то я тем более не в курсе.

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

В смысле, ссылку на первое использование термина я привел.

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