LINUX.ORG.RU

(хочу невозможного) Есть ли ЯП со встроенным LISP-подобным макроязыком

 ,


1

5

Собственно, когда-то очень давно пользовался MASM'ом (верси 6.11, если мне склероз не изменяет), так там был встроенный макроязык, который сначала было очень трудно освоить, но зато после того, как я им проникся, я начал писать асм-код в разы быстрее, поскольку генерировал львиную часть кода именно им.

И давеча подумал я на досуге: вот мне трудно осваивать LISP с нуля, но если бы он был встроен в какой-то другой язык, вполне себе общего назначения - скорее всего мало-помалу я бы стал использовать его всё больше и больше и в конечном итоге код на LISP'е стал бы как и в случае с макроассмеблером составлять вообще большую часть кода, после чего перейти на любой полнойценный LISP-based язык не составило бы труда.

Внимание, вопрос: в каком «обычном» ЯП можно использовать LISP в качестве встроенного макроязыка?

Спасибо!

★★★★★

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

Последний из экспериментов - Nemerle, вроде как почил, т.к. новостей про него не слышно особо.

Norgat ★★★★★
()

Если твоя цель - изучить Lisp, то можешь в свой любимый язык вковырять интерпретатор на базе ecl, ccl, guile, что-то еще или просто учи Lisp. Если же просто нормальные (плюс-минус) макросы в языке нужны для повышения выразительности и эффективности, можешь глянуть на Ocaml + ppx или Scala + scala.meta

anonymous
()

Присоединяйся к проекту Яр.

https://bitbucket.org/budden/yar

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

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

Какой плюс есть у макросов?

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

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

Ну вот и пиши себе препроцессоры на произвольных языках. :DDDDDDD

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

и в горячей замене кода

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

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

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

... Разберись в терминах.

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

Какой плюс есть у макросов?

Макросы — и есть разновидность препроцессора. Причём этот препроцессор позволяет добавлять новые команды-макросы прямо в тексте программы. На каком целевом языке делать макросы, в общем-то неважно.

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

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

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

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

Это обновление программы без ее перезапуска.

Ну так у CL и Scheme это есть. Командой load или eval можно заменить код любых функций не останавливая программу. Что не так?

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

Не в любом. В Pascal, C или C++ нету eval.

monk ★★★★★
()

CLpython компилятор/транслятор второго питона в CL.

Parenscript транслятор в JS. Макросы CL/JS/CL+JS прилагаются.

ThinLisp и Vacietis - транлятор в С и компилятор его же в CL.

ABCL умеет дергать жабу с библиотеками поскольку на ней и основан.

Prolog в QL для кучи:)

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

говорят, код написанный на clojure можно запускать из java

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

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

С одной стороны (и не только с философской точки зрения) скомпилированная программа на Lisp больше не является Lisp вообще. Это нарушает фундаментальное правило «формальной эквивалентности кода и данных». Получившийся код не содержит S-выражений и не может быть обработан Lisp. Исходный язык (Lisp) преобразовывается в другой язык (машинный код) с неизбежными несовместимостями на разных машинах.

https://habrahabr.ru/post/177791/

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

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

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

Покажи мне этих людей. В лиспе нет эксклюзивных фич. Рестарты были в Смоллтоке, остальное уже разобрали ИТТ.

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

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

В лиспе инфраструктура заточена под перекомпиляцию в рантайме. Если переопределить класс, то можно продолжать использовать созданные до этого объекты класса так, как если бы у них было новое определение (с генерацией ошибки если они несовместимы). Если переопределить функцию, она сразу же будет использоваться (если она не заинлайнена). Классы, функции и глобальные переменные можно также удалять, так что попытки их использовать будут выдавать соответствующие ошибки (тоже есть тонкости). В других языках с eval я такой поддержки не видел, возможно, потому что в них часто REPL почти не развит и нет символов.

Jini ★★
()

хочу невозможного

Йогурт «Чудо» - специально для вас! :-)

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

Если переопределить класс, то можно продолжать использовать созданные до этого объекты класса так, как если бы у них было новое определение

Во всех динамических ООП-языках это так. Только в лиспе, насколько я помню, это реализовано через жопу, при каждом переопределении класса там все потомки перезаписываются.

Если переопределить функцию, она сразу же будет использоваться (если она не заинлайнена)

то же самое

На вскидку JS и Io, self и lua. Скорей всего, также смоллток, руби etc. Тысячи их.

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

Покажи мне этих людей

легко

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

(хочу невозможного) Есть ли ЯП со встроенным LISP-подобным макроязыком (комментарий)

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

linearisation
()

В GIMP вроде как был Script-fu на базе Scheme. Может, оттуда можно выковырять движок и вставлять в другие программы на C или C++? (Да, боже упаси, я не говорю «это легко». Даже почти наверняка наоборот. Но если движок отлажен и почищен, возможно, это имеет смысл.)

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

а используя макросы я ограничен макроязыком

Фишка лиспа в том, что макроязык это и есть целевой язык. Т.е. как препроцессор для С на С.

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

Раз уж лисп сейчас не стоит изучать и его место на свалке истории, то может ты знаешь язык который пришёл ему на замену, который лучше и включает все эти самые «эксклюзивные» фичи?

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

Про эксклюзивность этих плюсов ничего в цитате сказано не было.

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

Раз уж лисп сейчас не стоит изучать и его место на свалке истории, то может ты знаешь язык который пришёл ему на замену, который лучше и включает все эти самые «эксклюзивные» фичи?

Легко. Common Lisp. Отличная замена старому лиспу, вполне современная, и включает все нужные фичи.

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

common lisp не является полноценной заменой лиспу. Там нет эквивалентности кода и данных, нет fexpr'ов, полноценной рефлексии и тд

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

Там простой guile.

да ну, а есть подтверждающий линк?

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

Там нет эквивалентности кода и данных, нет fexpr'ов, полноценной рефлексии и тд

Тогда бери picolisp

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

common lisp не является полноценной заменой лиспу. Там нет эквивалентности кода и данных, нет fexpr'ов, полноценной рефлексии и тд

Если вам нужно чтобы всё было как в LISP - берите LISP.

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

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

Virtuos86 ★★★★★
()

есть лисп, который встраивается в С. я как-то даже игралась с ним. думаю, что если в С встраивается, то и в любой другой язык можно порты сделать. или они даже есть. я, кажется, какой-то другой использовала, но не помню уже. вот один из вариантов встраиваемого в С/C++ лиспа. там даже примеры есть, конкретно с Qt: https://common-lisp.net/project/ecl/

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

This. Мы сначала боялись внедрять Яр c ребятами, но я их уговорил перевести небольшой сервис на сабж. Когда все увидели глубину и выразительность языка, то все вопросы отпали.

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

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

https://habrahabr.ru/post/177791/

Начало статьи :«От переводчика: В 2007 году, в поисках веб-движка я наткнулся на очень интересный и необычный диалект лиспа.»

Затем выясняется, что статья о PicoLisp!

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

Подсказка: В 90е некоторые ставили на жигули мерседесовскую фигурку на радиатор. Становились ли от этого жигули мерсами?

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

Вот мне в CL не хватает системы неймспейсов из бетона.

согласен (хотя сам не страдаю). также, идиотская система пакетных никреймов. но писать-то удобнее на ЦЛ, а отдавать заказяику на питоне. не?

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

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

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

тупость твоя безгранична

ЗЫ. круг нарисовал?

anonymous
()

javascript C asm

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

Зачем из питона транслировать в ЦЛ

Что бы безшовно дергать прикладную логику зашитую в питонячий код написаный кем-то другим. Питонячьми функции отранслируютя в аналогичные Defun-ы и.т.д и пользоватся этим станет несколько удобнее чем RPC. Как бесплатный бонус отранслированый в CL код работает сильно быстрее за счет компилятора.

Мне например было нужно работать с парой кустарных сетевых протоколов местного розлива. Ну и работа с ними была описаны исключительно в коде на питоне. И плюс они еще время от времени обновлялись:( И это питоновская прослойка ударно тормозила на моих данных. А вышеописаный CLPython успешно помог интегрировать эту хрень в лисп и ускорил к тому же.

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