LINUX.ORG.RU

Свой Lisp на JavaScript

 ,


0

2

Если вам интересна тема разработки компиляторов/транслтяторов, то предлагаю вам поучаствовать в проекте по написанию Lisp на JS. Да, еще один Lisp да еще и на JS :) Естественно, целью проекта не является покорение олимпа языков, транслирующихся в JS, но вот процесс ради процесса - это то, что движет этот проект. Реализовано уже немало, но многое еще осталось: - система модулей; - interoperability с JS; - расширение стандратной библиотеки; - оптимизация производительности;

Если интересно, то вам сюда: https://github.com/daynin/tiny-lisp


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

Добавлю по теме препроцессора. На самом деле, понять суть его легко. Представим себе, что у нас есть язык. Мы написали для него препроцессор. Теперь, в исходный текст языка мы можем вставлять шаблоны, которые препроцессор будет перезаписывать перед компиляцией. Теперь делаем следующий шаг — определяем инструкции для препроцессора, синтаксис, который будет диктовать препроцессору правила, по которым он должен менять текст в шаблоне, с тем или иным идентификатором. Далее, мы пишем эти инструкции в тексте программы, а препроцессор модифицируем таким образом, чтобы он считывал эти правила из из текста программы в первую очередь, уничтожая их при этом. Все, мы имеем макросистему.

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

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

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

Все, мы имеем макросистему

Дело не в макросистеме, а в том, что код=данные, т.е можно манипулировать кодом, как деревом.

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

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

на каком языке написан препроцессор никакого значения не имеет.

а в том, что код=данные, т.е можно манипулировать кодом, как деревом.

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

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

мы используем язык,

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

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

на каком языке написан препроцессор никакого значения не имеет

Да. Значение имеет, какой язык обрабатывается.

любым кодом можно манипулировать как деревом

Можно, но сложность различается.

Код = данные несколько другое означало

Именно это означало.

Это не справедливо для современных лиспов

4.2

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

В лиспе нет.

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

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


function := block(x, y, x - y)

macroReplacer := block(function,
   function message next setName("+")
)

macroCombinator := block(x, y,
   x call(y)
)

macroCombinator call(macroReplacer, function)

function call(1, 2) // 3

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

работала быстрее

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

И по ссылке твоей про JS разводняк какой то наивный. Че это он примеры такие показывает детские? Я такую «реализацию» как у него в 10 строк на Io накатаю. Когда что-то стоящее запиливают, обычно что-нибудь кошерное демонстрируют, а не детские примеры. Или это очередная серия «очередной лиспер не зная JS запилил мегадвижок JS»?

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

И зачем ты мне об этом говоришь? Борща тебе налить или что?

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

Посмотри, как реально выглядит в Языке, то что ты декларируешь, код == данные и прочее ко-ко-ко

Пфф, лошара - смотри и учись.

(defun f (x y) (- x y))

(f 2 1)

> 1

(setf (symbol-function 'f) (coerce (subst '+ '- (function-lambda-expression #'f)) 'function))

(f 2 1)

> 3

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

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

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

А на JS легко твою пургу написать. function+«» и делай что хочешь с ней. Но так как на Io, где функция — Ъ-объект, не напишешь и на JS

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

Io, где функция — Ъ-объект, не напишешь и на JS

бл ... анонiмус! Рад видеть, друже *смахивает слезу*, снова ты с нами! *всхлипывает*, все за io тут толкуешь. Как там проекты на io поживают? Что нового автор сего языка на нем написал? Как там твой круг? *разрыдался*

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

Показывай

Ты кукарекал, что в лиспе код!=данные, а тебя обоссал. Свой макрокомбинатор можешь сусолить в своём Языке, а в лиспе он просто не нужен.

function+«» и делай что хочешь с ней.

Давай делай, не вижу код.

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

По существу чего? Твоя бесполезная хуетушка к макросам Лиспа никакого отношения не имеет.

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

я тебя обоссал и обосрал тебя дважды — первый раз когда ты кукарекал о фазе в розетке(и так и не отдал должок, кстати), второй раз в теме про call-by-value когда ты кукарекал про то что в scheme не так как в JS. Это только из того что я помню. Стоит ли удивляться, что ты сейчас обоссал и обосрал сам себя, выложив левый код, который якобы эквивалентен. Иди в душ сходи, петушок, воняет.

Давай делай, не вижу код

лови, лишний раз попустить тебя не помешает

f = function(x, y){return x - y}
f = Function(String(f).match(/\(([^)]+)/)[1], String(f).match(/{([^}]+)/)[1]. replace("-", "+"))
f(1, 2) // 3

filequest
()
Ответ на: комментарий от filequest
f = function(x, y){return ['lol - lol', x - y]}
f = Function(String(f).match(/\(([^)]+)/)[1], String(f).match(/{([^}]+)/)[1]. replace("-", "+"))
f(1, 2) // ["lol + lol", -1]

Свободен, днарина.

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

ты че этим хочешь сказать?

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

Кстати, у меня там не переопределяется слот

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

(defun f (x y) (- x y))

(defmacro f+- (f &rest args) 
  (apply (coerce (subst '+ '- (function-lambda-expression #'f)) 'function) args))

(f 2 1)
> 1

(f+- #'f 2 1)
> 3

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

Для какого любого? Просто плюс менять при любом окружающем коде? Ты че реально думаешь что это трудно сделать? Я почему спрашиваю, просто не верится, что человек может быть настолько тупым, и при этом программировать что-то.

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

Что именно? В его примере меняется первое вхождение - вместо второго. Все равно, что предъявлять, что лисп автоматически не может выявить разницу между (car list) и (cadr list). Тупость терминальная. Да и вообще, это левые дебри, которые темы не касаются.

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

Естественно не имеет, так как макросы этого не могут, об этом и разговор был.

Говнорефлексия - частный случай метапрограммирования и нервно покуривает в сторонке на уровне макросов Лиспа. В метаобъектный протокол тебя уже рожей тыкали.

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

Строго наоборот.

Метапрограммирование - частный случай рефлексии? Ну окей тогда.

Метаобъектный протокол — это костыль, а не фича. Все что делается с ним, можно сделать и без него.

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

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

Просто плюс менять при любом окружающем коде?

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

просто не верится, что человек может быть настолько тупым

Ты дурачка то выключи, просто замена + на - регексом нахер никому не нужна в контексте рефлексии.

Давай так, в лиспе код таки = данные или нет? В js можно в тексте функции легко заменить операцию - на + или нет?

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

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

в лиспе код таки = данные или нет

нет

В js можно в тексте функции легко заменить операцию - на + или нет?

Да

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

в лиспе код == <какое то скомпилированное говно к которому нет доступа, как и влюбом другом недоязычке>

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

нахер никому не нужна в контексте рефлексии.

Во мля жгун, какую ты рефлексию то нашел в лиспе, если не считать eval/quotedList, что по сути, то же самое, что eval/string в любом другом ЯП. Не путай рефлексию с макродрочкой, а то так и очко свое проспоришь.


ога, разница в том, что регекспы мощней и внятней чем твои (caaaar(cdr%$$^^%(cdddr(lisp sucks))))

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

выкатывай пример с которого начали

Выкатываю второй раз. Что конкретно тебя тут не устраивает?

Свой Lisp на JavaScript (комментарий)

какую ты рефлексию то нашел в лиспе

Это ты нашёл.

Говнорефлексия - частный случай метапрограммирования
Строго наоборот.

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

разница в том, что регекспы мощней и внятней

Ты в курсе, что регексы не тьюринг-полные? И да, если для тебя регексы внятнее, то ты или наркоман, или ни разу не писал регексов длинее чем в твоём примере. Кстати, даже в нём *)(&^%#$*), как будто жопой на клавиатуру сел. О чем ты вообще кукарекаешь?

В js можно в тексте функции легко заменить операцию - на + или нет?

Да

Ок, показывай, это ж просто.

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

Что конкретно тебя тут не устраивает

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

f = function(x, y){return x - y}
makeSum = function(f){
  return Function(String(f).match(/\(([^)]+)/)[1], String(f).match(/\{([^}]+)/)[1].replace("-", "+"))
   .apply(null, [].slice.call(arguments, 1))
}


makeSum(f, 1, 2)// 3
без тяжелой артиллерии. Тебя носом ткнуть? про какой код идет речь, или дальше будешь дурочку корчить?

Не?

Ну, там было в том высере, это сказано в таком контексте, что типа, макросы рулят. Так да, частный случай, но наиболее мощный.

Короче, дальше идет вода и слезы от обиженного, впадлу продолжать

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

Если есть возражения, выкатывай пример с метаобъектным протоколом, который невозможен в нормальном ООП - языке, например в Io — ЧИСТО объектно-ориентированном языке, в отличии от лиспа и клоз. А так, ты просто кукарекнул, и твое кукареку не защитано.

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

Метапрограммирование - частный случай рефлексии? Ну окей тогда.

Строго наоборот относилось не к этому, а к тому кто покуривает (в чем мы в очередной раз убедились в этом треде)

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

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

`fn = (function(){ var tmp = 10; return function (x, y) { return x - y * tmp } })()`

вот тут, если ты сделаешь замену своим регекспом - на + то все сломается, потому как доступ ты к строковому представлению скоупа ты не имеешь

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

Ну покажи обратное.

После `fn = (function(){ var tmp = 10; return function (x, y) { return x - y * tmp } })()`

fn // function (x, y) { return x - y * tmp }

Если ты заменишь тут своим регекспом - на + и сохранишь новую функцию, а потом попытаешься вызвать, то у тебя вылетит исключение, потому что tmp undefined

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

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

А так тогда все просто, то что до тебя докапываются выше с тем, что надо заменить ТОЛЬКО оператор, но ничего кроме - используется любой AST парсер (например esprima) и точно так же на лету все меняется.

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

Если есть возражения, выкатывай пример с метаобъектным протоколом, который невозможен в нормальном ООП - языке, например в Io

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

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

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

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

Кукарекалка, ты тут кудахчешь за io и за волшебное ООП, но при этом ТЫ САМ не написал на нем ничего полезного, ты - трепло и не способен ни на что вообще, кроме «Ыысмотрите как ио умеет ыыы фсеостальные так не могут».

Тебе прям в лоб спрашивают «давай проект, покажи что-то, где это применили и получили уникальную вещь или ВОООТ такой профит, покажи уже хотя бы какой-то СВОЙ проект, сложнее хеловорда», нет ты выебываешься и сливаешь. Даже автор ио пишет на обжСи и свифте, лол.

Сливай дальше, балабол.

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