LINUX.ORG.RU

bike 0.14.0 - документация!

 , , ,


0

4

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

https://github.com/Lovesan/bike/blob/master/doc/README.md

Кроме документации, доделал классы, которые могут вызываться из .NET. Вот в частности пример, как реализовать интерфейс IReadOnlyList<object> для лисповых коллекций:

https://github.com/Lovesan/bike/blob/master/examples/callable-classes.lisp

Также, добавил полноценную поддержку ECL. Единственная проблема с ECL в том, что он компилируется через Си, а так как библиотека активно использует компиляцию и кодогенерацию в рантайме(как на стороне .NET, так и в лиспе), то ECL постоянно вызывает компилятор сишечки, например GCC.

Также добавил функциональность по типу apropos, но для .NET классов, неймспейсов и членов классов.

Так, например, такой код:

(type-apropos "xml")

Выведет имена .NET классов, содержащие «xml» (сраную гору их просто; я даже сам не знал что их так много в стандартной библиотеке).

Также, обновление содержит кучу мелких багфиксов и улучшений, о некоторых из них можно почитать в CHANGELOG:

https://github.com/Lovesan/bike/blob/master/CHANGELOG.md

★★

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

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

Неудобные вопросы, мне кажется, задает этот господин.
Но вот Лавсан запилил свой «байк», а другого аналога нет готового. Теперь он может прибить туда свои аннотации, и другие лишперы будут вынуждены их проглотить.

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

Photoshop может получше, но как Photoshop.Net будет запускаться на Mac OS, можно узнать?

Очевидно, интерфейс придётся писать на Avalonia. В качестве примера существует векторный редактор под вин/мак/лин на Avalonia: https://icons8.com/lunacy

Или вопрос не об этом?

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

Обсуждается 1994 год, monk предложил представить что именно тогда Microsoft решил выпустить C# на замену С++.

Очевидно, интерфейс придётся писать на Avalonia.

Очевидно, никто не будет этого делать.

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

В 1994 у Майкрософта для прикладных приложений в качестве конкурента C++ был только Visual Basic. И то компилятор и поддержку OCX добавили только в 1995 году, а свои COM-компоненты стало возможно писать только в 1997 году.

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

В 1994 у Майкрософта для прикладных приложений в качестве конкурента C++ был только Visual Basic.

Потому что они решили реализовать MSVC. А могли сразу пойти по пути NIH (сделать свой C#) или взять Objective C и программисты писали бы на том, что есть, также как до сих пор пишут на Visual Basic.

Даже на 1С сейчас многие миллионы строк кода только потому, что первые миллионы строк написала сама 1С. Если бы просто кто-то написал компилятор с таким синтаксисом, то был бы ещё один язык как Рапира и Глагол.

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

Нет конечно. Он был бы там же где Дельфи. То есть в глубокой жопе вообще.

gcc/g++ всё-таки постарше будет. И развивали бы его потихоньку несмотря на малое количество пользователей. Это Дельфи никому не нужен, потому что пока был жив, был или очень дорогой или пиратский.

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

Потому что они решили реализовать MSVC.

Они перепилили Lattice C.

Ну и в конце 1980-х и начале 1990-х выбор был небольшой. Вроде как тот же Objective C был никому не нужен за пределами Next-а (и таковым бы и остался, если бы ребята из Be Inc не просрали полимеры и не проиграли Джобсу в умении впарить Apple свою разработку). Вспоминаются разве что Pascal (например, в варианте Turbo Pascal), Modula-2, Ada. Только вот ООП из них поддерживал лишь C++, а для наступающего века GUI это самое ООП было важно.

Делать тогда безопасный язык с GC для PC была так себе идея, ни мощности, ни памяти не хватало. Вышедшая в 1995-ом году Java наглядно демонстрировала что такое настоящий тормоз.

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

Если бы просто кто-то написал компилятор с таким синтаксисом

1С отвратительная поделка, существующая тут, благодаря законодательству. Та срань господня которая там внутри это продукт жадности и узколобости менеджмента и собственников этой компании.

https://2ch.hk/pr/src/2968581/17029192523532.jpg

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

Зато всё понятно, причём даже не программисту. Эдакий современный COBOL получился.

существующая тут, благодаря законодательству.

Процитированный кусок из 1С:Управление Торговлей, которая к законодательству РФ практически не привязана.

http://yellowsun.pro/solutions/?ELEMENT_ID=7066

https://1c.com.vn/en/products

https://1c-dn.com/solutions/1c-trade-management/

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

Только вот ООП из них поддерживал лишь C++

???

Turbo Pascal 5.5 (1989 год) поддерживал классы, объекты и модули. И в C++ тогда это всё тоже было практически в зародыше.

Вышедшая в 1995-ом году Java наглядно демонстрировала что такое настоящий тормоз.

Вышедший в 1996 Visual J++ работал достаточно быстро (в несколько раз быстрее, чем Java).

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

Turbo Pascal 5.5 (1989 год) поддерживал классы, объекты и модули.

От ведь. А действительно. Мне почему-то казалось, что ООП в Turbo Pascal завезли позже.

Спасибо за напоминание.

И в C++ тогда это всё тоже было практически в зародыше.

В С++ классы и объекты были с 1985-го, с самого первого релиза.

Это сейчас модули только в самом зародыше :)

Вышедший в 1996 Visual J++ работал достаточно быстро (в несколько раз быстрее, чем Java).

И сильно-сильно медленнее, чем C++.

eao197 ★★★★★
()

У вас в лиспе нету функции List<>.add(int n, E element)?

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#add-int-E-

Вот уж List Processing language, это как Forth где нету swap, как Perl без substr.

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

как Perl без substr.

Дружище, ты же «не в теме», а что-то утверждаешь.
На https://forum.foxclub.ru/ публиковал библиотеку для Perl, в
которой 100% были реализован API Foxpro 2.6 для работы с строками.
Насколько эффективно API?
2000 расчётных листков формирует за одну секунду.

Немного сарказма.
Бедный Perl, в нём даже нет функции substr.

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

Если бы Вы сказали «это как если бы в Forth не было swap, а в Perl substr.», то было бы понятно о чём речь, а
в изначальном посте было суждение «это как Forth где нету swap, как Perl без substr.».
Разница в суждениях очевидна.

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

И что там используется вместо List<>? Когда нужно вставлять быстро значения в произвольные места?

Надеюсь что не пишут (class CList (((...))))

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

List<> это тоже не список, это динамический массив.

В лиспе для такой цели есть собственно массивы.

У одномерных массивов там может быть указатель заполнения, и другие вещи которые есть в List<>, и даже больше

(let ((v (make-array 0 :adjustable t :fill-pointer 0)))
  (vector-push-extend "foo" v)
  v)
;; => #("foo")
lovesan ★★
() автор топика
Ответ на: комментарий от monk

Зато всё понятно, причём даже не программисту. Эдакий современный COBOL получился.

Синтаксически это на 99% Visual Basic, только все ключевые слова, объекты и методы на русском языке.

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

List<> это тоже не список, это динамический массив.

Это интерфейс, LinkedList<> хранит в себе указатель на Node, а Node это типичный Node из prev, next. Если это не список, то что тогда список?

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

Синтаксически это на 99% Visual Basic, только все ключевые слова, объекты и методы на русском языке.

Где dim X as Integer?

Где dim X(10) as integer?

Где Public Sub?

Где Select case?

Где Static?

Где X ^ Y?

Просто похоже на некую смесь, плохо, и быстро сделанную.

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

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

Так хорошо и правильно. Если в предметной области есть сущность «Накладная на проводку формы остатков», то и в коде будет накладнааяНаПроводкуФормыОстатков(). Удобно. Не нужно выяснять как это перевёл очередной малаграматный балбес, очень гордый своим знанием английских слов main, for, if etc.

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

практически не привязана.

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

Зато всё понятно, причём даже не программисту. Эдакий современный COBOL получился.

У вас батенька, стокгольмский синдром.

1С:Управление Торговлей

Пачка конф и все бестолковые любой из них - пока не напишут сопоставимый с конфой объем кода, пользоваться можно сильно с натяжкой.

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

Да, именно так. Особенно когда условный гугл-транслейт предлагает для слов «накладная» и «счёт-фактура» одинаковый перевод invoice, да и просто «счёт» тоже можно перевести как invoice. А это всё три разных документа.

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

И с 1с бухгалтерией данными не обменивается, они в ней появляются по воле святаго духа не иначе.

Обменивается с чем угодно, что умеет HTTP и XML или JSON.

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

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

У вас батенька, стокгольмский синдром.

Нет. Я же не только на 1С пишу. И если ТЗ на русском языке, то на 1С его реализовывать в несколько раз быстрее.

пока не напишут сопоставимый с конфой объем кода, пользоваться можно сильно с натяжкой

Назовите, чем пользоваться вместо 1С: Управление Торговлей. Альтернативы, которые я видел (СБИС, Эвотор, …), заметно уступают по возможностям.

Конфигурациями 1С успешно пользуются сотни тысяч организация даже без доработок вообще (есть у 1С базовая лицензия, которая не позволяет дорабатывать, и есть облачная 1С:Фреш: обе пользуются очень большим спросом).

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

У вас в лиспе нету функции List<>.add(int n, E element)?

Так она однострочник. (push e (cdr (nthcdr …))).

это как Forth где нету swap, как Perl без substr

Это как Forth, где нету https://learn.microsoft.com/en-us/dotnet/api/system.collections.stack.contains

Или как Perl без https://learn.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.getgroupnames

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

Так она однострочник. (push e (cdr (nthcdr …))).

while (*a++ = *b++);

Но все же есть strcpy

Это как Forth, где нету https://learn.microsoft.com/en-us/dotnet/api/system.collections.stack.contains

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

Где нужно add(int n, E e), я могу представить.

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

Видимо так, потому что метода Insert() для Vector я в Common Lisp не нашел. И судя по всему, Vector это массив (удивительно?), я подумал что возможно это более продвинутая структура которая позволяет легко делать вставки.

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

Но все же есть strcpy

Копирование строк нужно часто. Вставка элемента в середину списка по номеру позиции мне ни разу не нужна была. Список всегда с головы добавляется. В исключительных случаях что-то в конец дописывается.

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

Я про списки, не про строки.

В C есть <sys/queue.h>

Там есть LIST_INSERT_*

На Windows его может быть нету, ну можно просто скопировать этот файл, там нету больше инклудов.

Я не знаю реализаций List где нету Insert. Кроме лиспов.

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

Я не знаю реализаций List где нету Insert. Кроме лиспов.

В лиспах есть cons. В common lisp ещё есть rplacd. И суть всех лисповских списков в том, что хвост списка является списком.

В то время, как в sys/queue вообще нет аналога tail (чтобы получить из списка новый без первого элемента), а в java рекурсивный обход через sublist теоретически возможен, а практически будет жрать память.

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

Я когда начинал писать на питоне, написал обработчик списка в стиле

def f(l, a):
  ...
  ...
  return f(l[1:], b)

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

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

Как нету? Можешь либо обязаться не использовать back, либо использовать SLIST.

И как мне этот SLIST поможет?

    struct SListItem* item = NULL;
    SLIST_HEAD(SListHead, SListItem) shead;
    SLIST_INIT(&shead);
 
    item = (struct SListItem*)malloc(sizeof(struct SListItem));
    item->data = 1;
 
    SLIST_INSERT_HEAD(&shead, item, entry);
 
    item = (struct SListItem*)malloc(sizeof(struct SListItem));
    item->data = 2;
 
    SLIST_INSERT_HEAD(&shead, item, entry);

Что мне написать, чтобы получить голову списка, являющемся хвостом списка shead? То есть, что должно быть вместо tail здесь:

   SLIST_HEAD(SListHead, SListItem) shead2 = tail(&shead);

?

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

Или как, имея элемент и список, создать новый список с элементом в качестве головы и существующим списком в качестве хвоста?

Такое даже на java нельзя. Нет там конструктора типа List(Element e, List l).

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

Или как, имея элемент и список, создать новый список с элементом в качестве головы и существующим списком в качестве хвоста?

Просто головное поле добавить, там же нету разделение по типам между item и head.

В Java subList принимает индексы, что неудобно, но в целом сделать тоже можно, просто не особо эффективно. Сделать метод у элемента asTailList(), который возвращает subList()

MOPKOBKA ★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от monk
public class Main {
    public static class Element {
        protected int value;

        Element(int value) {
            this.value = value;
        }

        List<Element> asHeadAndTail(List<Element> parent) {
            return parent.subList(parent.indexOf(this), parent.size());
        }
    }

    public static void main(String[] args) {
        List<Element> list = new ArrayList<>();
        list.add(new Element(10));
        list.add(new Element(20));
        list.add(new Element(30));
        list.add(new Element(40));
        list.add(new Element(50));

        var head = list.get(3).asHeadAndTail(list);
        head.add(0, new Element(35));
        head.add(2, new Element(45));

        for (var item : list) {
            System.out.println(item.value);
/*
10
20
30
35 Если нужно поведение не добавляющие здесь 35, то это уже не список с элементами должен быть, а ячейки как в лиспе, если не нужно изменять оригинал то нужно сделать копию в методе. 
40
45
50
*/
        }
    }
}
MOPKOBKA ★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)
Ответ на: комментарий от MOPKOBKA

Весь вопрос производительности такой структуры.

Потому что «Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the returned list is empty.) The returned list is backed by this list», боюсь, предполагает создание прокси-объекта.

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

Создается subList() возвращает SubList<E>, в любом случае надо иметь поле, или какой то объект хранящий поля. Там только parent, size, offset.

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

В других языках не принято смотреть на части списка, как на отдельные сущности, сам List может быть как массивом, так и списком. Списочная сущность это больше как акселератор для некоторых видов задач, ну или как «движок базы данных».

У меня кстати вопрос по лиспу, вот есть у меня элемент, есть список, могу ли я взять эффективно предыдущий элемент от этого элемента? Если бы это был С, я бы сделал item = item->back. В Java со своей реализацией списка, я бы сделал item = item.getListItem().back().getValue()

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

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

Именно так. А в лиспе список в первую очередь конструкция для рекурсивной обработки. И в Haskell также.

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

Если это стандартный односвязный список, то очевидно, что нет (нужно искать от головы до предыдущего).

Можно использовать двусвязный список https://github.com/krzysz00/dlist

Тогда просто (prev element).

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