LINUX.ORG.RU

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

 , , ,


2

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

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

Ответ на: удаленный комментарий

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

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

не предназначенными для использования людьми. В отличие от.

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

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

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

Как можно писать на языке, где у тебя все зашито в строгие рамки, шаг вправо шаг влево - расстрел, нельзя пощупать и потыкать объекты в рантайме, и так далее?

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

шаг вправо шаг влево

снег башка попадет

А вот не надо ходить влево, вправо, если это не предусмотрено, а скорее всего наоборот, предусмотрительно запрещено.

все зашито в строгие рамки

И не без причин.

Людям надо рамки ставить, иначе фантазия заведет туда, откуда отладка будет месяц вытаскивать не вытащит.

Машину, с другой стороны, ограничивать не надо. У неё ненужной шиложопной фантазии нет. Ей дали лисповое дерево, правила трансляции, она его преобразовало. И можно быть уверенным, что ей не захочется влево-вправо сходить.

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

нельзя пощупать и потыкать объекты в рантайме

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

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

А вот не надо ходить влево, вправо, если это не предусмотрено, а скорее всего наоборот, предусмотрительно запрещено.

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

Людям надо рамки ставить, иначе фантазия заведет туда, откуда отладка будет месяц вытаскивать не вытащит.

Это в таких языках, где инструментов для отладки нормальных нет. Типа Python того же. 10k строк кода - все, начинается ад. 50 - начинается просто треш, неотлаживаемый и неподдерживаемый.

В лиспах отличные дебаггеры, и в рантайме можно посмотреть а что собственно происходит. Даже можно подключиться к удаленной системе. Потыкать объекты, поменять код там или тут.

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

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

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

И кстати, а задача-то какая, программу написать, или объекты пощупать?

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

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

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

дизайнеры языков - сраные недоучки

Непризнанные гении ITT!. Да, не они же «придумали» квадратные скобочки в лиспе, значит недоучки.

проектируют языки специально для дебилов.

По секрету лично рассказали?

10k строк кода - все, начинается ад.

А что, 10к лиспового кода конфетка что-ли? Ну-ну, свежо предание.

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

Дебаггеры везде.

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

По секрету лично рассказали?

https://twitter.com/16kbps/status/1195081752659865615

А что, 10к лиспового кода конфетка что-ли? Ну-ну, свежо предание.

В 10k на лиспе хотя бы можно разобраться.

Люди и в больших проектах на лиспе разбираются, см. SBCL.

Дебаггеры везде.

Я за всю профессиональную карьеру только 2 раза видел нормальные дебаггеры, это в CL, и в C#. Всё. Остальное, от жабы до JS это сраный неюзабельный треш.

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

Люди и в больших проектах на лиспе разбираются, см. SBCL.

Ты понимаешь же, что реализация языка – зачастую один из самых жирных открытых проектов на этом языке? Вот смотри:

Люди и в больших проектах на голанге разбираются, см. golang.

Люди и в больших проектах на русте разбираются, см. rustc.

Люди и в больших проектах на пистоне разбираются, см. pypy.

Люди и в больших проектах на хачкелле разбираются, см. ghc.

Так что твой этот аргумент – нифига не аргумент.

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

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

Как можно писать на языке, где у тебя все зашито в строгие рамки, шаг вправо шаг влево - расстрел, нельзя пощупать и потыкать объекты в рантайме, и так далее?

Разные языки для разных задач. Как там с применением лиспа в эмбеддщине? Как можно писать на языке с GC, жирным рантаймом и рефлексией, если у тебя дохлый контроллер с килобайтом оперативки и нужна реалтаймовость?

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

https://twitter.com/16kbps/status/1195081752659865615

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

В 10k на лиспе хотя бы можно разобраться

В 10k на питоне хотя бы можно разобраться

Я за всю профессиональную карьеру только 2 раза видел нормальные дебаггеры

Я бы не стал в таком признаваться. Это как-то явно не говорит в пользу вашей «профессиональной карьеры»

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

а ничего не смущает? что многословненько, но некими макросами можно ситуацию типа поправить. насколько я понял, cl - это общая форма синтаксиса(довольно неудобная, но общая) плюс куча макросов, что доводят это до состояния, пригодного программы писать. плюсы и прочие, все эти макросы прячут у себя в животе в синтаксическом анализе, и предлагают клиенту не заморачиваться их именами и форматом, предлагая искаропки читаемую форму того, что все равно надо написать на cl, чтобы не отвлекаться на детали.

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

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

Если соревноваться в перебирании структур/массивов, в плане наименьшего количества букв для N операций «из коробки», тут J/APL/наследники - выиграют без вариантов. Но это не значит что нормальные проекты на них писать удобно.

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

«синтаксис как в Си», вплоть до точки с запятой

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

А вот мне интересно, как на лиспе будет выглядеть любимая игрушка функциональщиков, арифметика Пеано. Только вот без целых чисел. С рекурсивными типами данных, как положено.

data Nat = Z | S Nat

add Z x = x
add (S a) b = S (add a b)

mul _ Z = Z
mul a (S b) = add a (mul a b)

toint Z = 0
toint (S a) = 1 + (toint a)

fromint 0 = Z
fromint n = S (fromint (n-1))

main = print $ toint $ mul (fromint 10) (fromint 20)
anonymous ()
Ответ на: комментарий от lovesan

Можно на лиспе навелосипедить подмножество лиспа и на нем писать, никаких проблем.

Можно конечно, есть даже такие https://github.com/carp-lang/Carp https://github.com/kiselgra/c-mera штуки. Только это будет именно что подмножество, т.е. никаких там рефлексий в рантайме. Common Lisp поддерживает создание функции во время выполнения, так что полноценная среда выполнения должна включать компилятор в байткод или в нативные инструкции целевой архитектуры(JIT), в случае байткода еще и его интерпретатор понадибится. Т.е. для применений в контроллерах, нужно Lisp очень очень основательно порезать, и останется от него только скобочки и возможность удобно метапрограммировать на этапе компиляции (но и это большой шаг вперед по сравнению с уродскими крестовыми шаблонами и сишным препроцессором например)

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

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

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

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

Если соревноваться в перебирании структур/массивов, в плане наименьшего количества букв для N операций «из коробки», тут J/APL/наследники - выиграют без вариантов. Но это не значит что нормальные проекты на них писать удобно.

дело не в переборе элементов массивов, а в том, насколько широко, писабельно и читабельно ооп поддержано в CL.

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

Common Lisp поддерживает создание функции во время выполнения, так что полноценная среда выполнения должна включать компилятор в байткод или в нативные инструкции целевой архитектуры(JIT),

Не в JIT а прямо в нейтив, как в SBCL. Никаких проблем с такой компиляцией даже у супер-урезанного лиспа не будет.

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

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

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

Но это конечно лучше делать через какой-нибудь примитивный интерпретатор или шитый код.

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

Так буквально и переводится

;; Nat = :zero | (:s Nat)

(defun add (a b)
  (if (eq a :zero) 
      b
      `(:s ,(add (cadr a) b))))

(defun mul (a b)
  (if (eq b :zero)
      :zero
      (add a (mul a (cadr b)))))

(defun toint (a)
  (if (eq a :zero)
      0
      (1+ (toint (cadr a)))))

(defun fromint (a)
  (if (= a 0)
      :zero
      `(:s ,(fromint (1- a)))))

(print (toint (mul (fromint 10) (fromint 20))))

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

Типа Python того же. 10k строк кода - все, начинается ад. 50 - начинается просто треш, неотлаживаемый и неподдерживаемый.

https://github.com/3b1b/manim – 290 Кстрок кода. Всё замечательно читается и отлаживается.

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

Люди и в больших проектах на лиспе разбираются, см. SBCL.

Вот его, как пример читаемого кода, я бы не приводил. ir2-optimize-jumps или digest-global-call не очень-то и легко понимаются.

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

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

e.serialize("yoba", yoba);
e.serialize("foo", foo);
e.serialize("bar", bar);
e.serialize("bar", baz);

А лиспы так могут :S

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

Ты серьезно?

Да. Читал и то и другое. Сходу читать тяжело, но при желании понять можно.

К слову, у GCC читаемость намного хуже (например, c_parser_declaration_or_fndef без очень сильной нужды я бы не пытался понять).

monk ★★★★★ ()