LINUX.ORG.RU

Навелосипедил квадратные скобки в лиспе

 , , ,


1

4

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

Тащемто теперь есть. Вот так можно вызывать методы:

(use-namespace 'System)

[:Console WriteLine "Hello, World!"]

Вот так можно получить текущее время в стринге: (ни одной круглой скобки! может это tcl/tk?)

[[:DateTime %Now] ToString]

А вот так получить значение максимального int32, из специального статического поля соответствующего класса:

[:int $MaxValue]

Более того, можно стучаться в индексеры дикшнрей и прочих объектов, даже круче чем в Clojure:

(let ((dict (new '(Dictionary :string :string))))
  (setf #[dict "Hello"] "World!")
  dict)

И создавать Enum-ы не обременяя себя расставлением запятых:

(use-namespace 'System.Reflection)

#e(BindingFlags Public Static)

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

(use-namespace 'System.Text)

(let ((dotnet-array [[:Encoding %UTF8] GetBytes "Hello, World!"]))
  (with-fixed (raw-pointer dotnet-array)
   (cffi:mem-ref raw-pointer :uint8)))
;; ==> 72

Не хватает батареек? Тогда мы идем к вам!

★★

Лавсан, я не понял, зачем это надо, но я восхищен! Молодец!

ferman
()

Олсо, лавсан, мне не хватает ресайзилок картинок в cl. Запили!

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

Он просто весь в боилерплейте. На какой-нибудь Boost.Geometry без слез не посмотришь.

Я даже не знаю во сколько раз оно бы уменьшилось, если бы в плюсах макросы были. В десять?

Это не проблема буста, вообщем-то, по хорошему так должен весь плюсовый код выглядеть.

Но обычно пишут хуже, от этого каждая кодовая база выглядит по своему и ее компоненты только друг с другом нормально стыкуются. Зато не нужно городить кучу шаблонов, только что бы какой-нибудь range-based for заработал, только потому что классу не посчастливилось иметь метод size и get_item.

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

Boost.Geometry без слез не посмотришь.

А что там? Сейчас выборочно потыкал, вроде всё прилично.

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

Так в CL та же беда. Я пытался в одном проекте подружить hu.dwim.perec и weblocks, достаточно быстро сдался.

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

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

Пишу на питоне. Очень удобно.

Если тебе неудобно на этом писать, то задумайся, а не неосилятор ли ты?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус. Но зачем?

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

Если тебе неудобно на этом писать

То можно взять Хуланг. Кроме обычной киллерфичи в виде макросов, ты наконец-то получаешь нормальные лямбды и перестаёшь считать пробелы.

no-such-file ★★★★★
()
Ответ на: комментарий от lovesan

О, вот чего-то такого я и ожидал. Да, «нахера». Крылов про это, помнится, целую басню написал.

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

буквально

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

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

Это я даже не говорю, про то, что лисп не проверит, что там ему в список сунули. Все это состоит из говна и палок, а держится на честном слове.

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

Щас бы на свежих плюсах написать пару сериализаций! Да как читаемо! И понятно, на детали не отвлекаешься!

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

alysnix ★★★
()
Ответ на: комментарий от monk
(defgeneric find (collection query))

(defstruct range
  (before 0 :type integer)
  (after  0 :type integer))

(defclass a () ())

(defmethod find ((c a) (q integer)) q)

(defclass b () ())

(defmethod find ((c b) (q range)) q)

https://ideone.com/eR160i

Не?

korvin_ ★★★★★
()

Объясните, как мне, схемеру со знанием кучки остальных язычков (из особо хайповых только один и от него невероятно тянет блевать; писался по необходимости код на другом хайповом, но от него тянет блевать вообще почти всех), найти работу, на которой за цл/схему будут платить? Вы-то, успешные лисперы, как я понимаю, работаете не на манагера, который уже выбрал стек технологий, а на заказчика, который вам верит. А это, как я понимаю, фриланс. Во фриланс вкатываться невероятно трудно.

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

за это надо жестоко заплатить могучим рантаймом с полной интроспекцией, что избыточна в 99.9 процентов случаев. Категорически не соглашусь. Для этого достаточна интроспекция времени компиляция и никакой рантайм не нужен. И ничего лишнего. Например, D, очень схожий с плюсами, это позволяет.

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

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

А в чем сложность? Ведь все ссылки есть, можно пройти по ним и взять что нужно.

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

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

Питон - это урезанный перл. Никакой простоты там нет, все нетривиальные вещи просто накрыли тряпочкой, тряпочки хватает всё меньше и меньше.

Вопрос: зачем советовать урезанный перл, если есть настоящий?

anonymous
()

[:Console WriteLine «Hello, World!»]

Двоеточие перед Console семантически означает, что у нас дальше будет вызов метода? А если методы в цепочке типа a.b.c и с >1 параметром, как это будет выглядеть?

[[:DateTime %Now] ToString]

Вот так что ли? А почему так, а не [:DateTime Now ToString] или [:DateTime %Now %ToString], если нам надо как-то отделить вызов метода по цепочке от параметров? Чем тебе не понравился кложурский вариант с -> и ->> ? Какие преимущества у твоего решения? Если можно, на примерах.

А вот так получить значение максимального int32, из специального статического поля соответствующего класса:
[:int $MaxValue]

Можешь расписать семантику? Если мы обращаемся через двоеточие в первом элементе списка в квадратных скобочках, но с большой буквы, как в случае с :DateTime и :Console - это вызов класса / объекта, а если :int и подобное с маленькой, то как это работает? Какие еще есть варианты использования? Двойное двоеточие например или что-то в таком духе. Почему здесь класс через $доллар в а первых примерах двоеточие, как это можно унифицировать?

Более того, можно стучаться в индексеры дикшнрей и прочих объектов, даже круче чем в Clojure:

И чем это лучше?

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

Аналогичный вопрос.

P.S.: Мечтаю увидеть язык, в котором автор занялся бы аргументацией внедрения тех или иных решений на синтаксическом / семантическом уровнях.

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

Двоеточие перед Console семантически означает, что у нас дальше будет вызов метода?

Нет, означает что аргумент не вычисляется (по типу как keyword), и это означает вызов статического члена класса.

Вот так что ли?

Я пробовал этот вариант, выглядит не-лиспово, неудобно, плюс непонятки с аргументами, куда их девать, как обрабатывать полноценные лисповые формы итд. Method chaining встречается не так часто, в плане читабельности лучше переменные определять и использовать какой-нибудь let*.

Можешь расписать семантику?

Первый элемент - либо имя класса(см выше), либо объект или форма, вычисляющаяся в объект. % перед именем члена - обращение к свойству, $ - к полю. без всего - к методу.

https://github.com/Lovesan/bike/blob/master/examples/syntax.lisp

Если мы обращаемся через двоеточие в первом элементе списка в квадратных скобочках, но с большой буквы,

case роли не играет, всё дело независимо от регистра. Просто пишу «как в C#» для удобства.

И чем это лучше?

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

Аналогичный вопрос.

Чем в C#, потому что лисп. Есть еще with-fixeds и with-fixeds*, где в отличие от C#, можно несколько объектов сразу.

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

…или не платить ничего за статическую интроспекцию, как это сделано в rust/D/nemerle/любой_язык_с_макросами.

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

rust/D/nemerle/любой_язык_с_макросами.

Эти макросы неюзабельны, я думаю скоро про это напишу статью.

В плане метапрограммирования они не более удобны, чем шаблоны C++, по ряду причин, включая типизацию и hairy syntax.

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

Господи, ну посмотри хотя бы на serde растовый, давно уже придумали как эти проблемы решать. tldr аннотации к полям.

Kuzy ★★★
()

А синтаксис перла в лиспе можешь навелосипедить? Тогда можно будет писать на лиспе, пока пишешь на перле.

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

Мне кажется ты мало писал на плюсах.

В расте ты не те макросы смотришь, там их два вида: одни с синтаксисом странным (macro_rules!), они очень лимитированные, да. А вторые это тупо функция которая поток токенов принимает и его же отдает (procedural macros). Алсо чтоб это было удобно юзать есть квазицитирование в отдельной либе - quote! Никакого отдельного синтаксиса нет (за исключением !, лан).

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

технически это можно сделать, но мне лень

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

А то, не дай б-г, статически докажет, что код говно, и откажется компилировать!

У меня че то такое было - valgrind сказал «у тя больше 100500 ошибок, ничем не могу помочь - ИДИ САМ ПРОВЕРЯЙ СВОЙ КОД!!!»

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

procedural macros

В хаскеле подобное тоже было. И много где еще, в том же немерле. И даже в скале. Я именно про них и говорю.

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

статически докажет

У меня че то такое было - valgrind сказал

Мда… Почитал бы про статический анализ, что ли.

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

Я в курсе про статический анализ. Поучились бы что ли читать и понимать написанное.

Зря похоже Вас из списка друзей убрал.

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

статически докажет

У меня че то такое было - valgrind сказал

Мда… Почитал бы про статический анализ, что ли.

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

статически докажет

У меня че то такое было - valgrind сказал

Антоний-тупорез опять выходит на связь.

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

Поучились бы что ли читать и понимать написанное.

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

Зря похоже Вас из списка друзей убрал.

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

i-rinat ★★★★★
()
Ответ на: комментарий от AntonI
--error-limit=<yes|no> [default: yes]
    When enabled, Valgrind stops reporting errors after 10,000,000 in total, or 1,000 different ones, have been seen.

Go fix your code он пишет вроде.

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

А если бы я сказал что у меня Фотошоп отказался обрабатывать фото заявив что композиция г-но? Или спеллчекер отказался чекать текст заявив что текст лишён смысла? Вы бы тоже кинулись поправлять что Фотошоп/спеллчекер это не статический анализатор? Потому что ведь исходный коммент @annulen про ограничение свободы машин довольно общий, и статический анализатор это лишь частный пример к чему такая свобода может привести.

Но Вы конечно зацепились за то что валгринд это не стат.анализатор, и решили конечно что собеседник не видит разницы, и конечно решили собедника посветить.

Но это показушничество какое-то и инфантильность. Молча заигнорить нельзя

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

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

Ты бы хоть на гитхаб проекта сходил на 5 минут и ридми с примерами пробежал. Глупых вопросов возникло бы меньше).

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

Он просто ко мне неровно дышит. Видать что то личное:-)

А вообще мысль про свободу интересная, но не новая. Хотя в плане поведения всяких утилит я че то сходу не вспомню что бы кто то это в литературе так вот раскрывал.

AntonI ★★★★
()

Давай без скобок.

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

Ах, не стоит. Я считаю, мы должны помогать становиться лучше друг другу.

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

Уроки по русскому языку ты прогуливал. Особенно те дни, когда рассказывали про неоднозначность указательных местоимений и когда учили, как эту неоднозначность из своих текстов убирать. Поэтому ерихоришься вместо того, чтобы просто пояснить свои слова, хотя явно видишь, что собеседник понял тебя неправильно.

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