У меня есть свой собственный интерпретатор Lisp в JavaScript, который я работаю уже некоторое время, и теперь я хочу реализовать макросы для чтения, как в Common Lisp.
Я создал потоки (почти работает, за исключением специальных символов)как ,@ , ` '
), но он замораживает браузер на несколько секунд при загрузке страницы с включенными скриптами (файлы lisp, содержащие 400 строк кода).Это потому, что мои потоки основаны на функции подстроки.Если я сначала разделю токены, а затем использую TokenStream, который выполняет итерацию по токенам, он будет работать нормально.
Итак, мой вопрос заключается в следующем: действительно ли строковые потоки есть в Common Lisp?Можете ли вы добавить макросы для чтения, которые создают совершенно новый синтаксис, такой как Python, внутри CL, это упрощает вопрос: могу ли я реализовать макрос """
(не уверен, что вы можете использовать 3 символа в качестве макроса для чтения) или другой символ, который будет реализовывать литерал шаблона внутри lisp дляЭкземпляр:
(let ((foo 10) (bar 20))
{lorem ipsum ${baz} and ${foo}})
или
(let ((foo 10) (bar 20))
""lorem ipsum ${baz} and ${foo}"")
или
(let ((foo 10) (bar 20))
:"lorem ipsum ${baz} and ${foo}")
даст строку
"lorem ipsum 10 and 20"
что-то подобное в CommonLisp, а насколько сложно было бы реализовать #\{
или #\:
в качестве макроса для чтения?
Единственный способ, которым я могу думать о наличии литералов шаблонов в Лиспе, это что-то вроде этого:
(let ((foo 10) (bar 20))
(tag "lorem ipsum ${baz} and ${foo}")))
где тег - это макрос, который возвращает строки с $ {} в качестве свободной переменной.Может ли макрос считывателя также возвращать код lisp, который был оценен?
И еще один вопрос: можете ли вы реализовать макросы считывателя следующим образом:
(list :foo:bar)
(list foo:bar)
, где: макрос считывателя и, если он находится перед символами, он преобразует символна
foo.bar
и, если он внутри, выдает ошибку.Я спрашиваю об этом, потому что в макросах на основе токенов :foo:bar
и foo:bar
будут символами и не будут обрабатываться моими макросами для чтения.
и еще один вопрос может быть вставлен в одну и вторую строку.линия использовать это?Это определенно будет возможно только для строковых потоков, а из того, что я тестировал, невозможно для интерпретатора, написанного на JavaScript.