Привет всем.
Короче, есть больная мысль сделать синтаксис доступа к элементам массива в си-стиле:
a[2][3]
вместо
(aref a 2 3)
Как сделать синтаксис типа #a[2][3] вроде понятно, а вот можно ли обойтись совсем без какого-либа префикса перед именем массива?
На лиспа давно ничего серьезного не писал, туплю.
Имхо ридером вряд ли получится без фокусов. Алгоритм в стандарте максимум что умеет из backtracking - unread-char делать, а при встрече с #\[ уже поздно, да и при имени массива больше одного символа не поможет.
Я бы предложил сделать макрос, который в своём body ищет вхождения name[i1][i2] и заменяет на вызовы aref sublis'ом. Если не заморачиваться на поддержку случая, когда к массиву обращаемся не напрямую, то будет проще и обрабатывать и обеспечивать защиту от утечек.
> Я бы предложил сделать макрос, который в своём body ищет вхождения name[i1][i2]
Можно. Правда придется тогда оборачивать каждую функцию этим макросом. Или определять свой defun. Правда вне defun работать не будет. Но как вариант сойдет, спасибо
Жалко что нет штатного синтаксиса под это, aref сильно ухудшает читаемость
Тут уже можно написать свой ридмакрос, который прочитает всё до конца файла и завернёт в вызов обработчика такого синтаксиса.
В принципе, на #\[ можно повесить ридмакрос, который сохранит - (переменную минус) и дочитает посимвольно квадратные скобки с индексами, а потом соберёт из этого aref. Но не сображу ночью, как именно форму утащить из - до eval, если лежащий там символ ещё не создан.
Я сделал [ a 2 3 ]. Вокруг квадратных скобок нужны пробелы.
После aref вздохнул с облегчением.
Исходники - здесь:
https://bitbucket.org/budden/cl-stirling-engine
я делал для доклада на spb global it meetup что-то похожее https://github.com/Lovesan/Prototype
вобщем суть была бы в том, что ты навешиваешь на все литеры-буквы один и тот же ридер-макрос, который имитирует считыватель, а потом проверяет, не стоит ли за символом скобка, если нет - считывает символ с помощью with-standard-io-syntax из полученной строки.
я так сделал для буквы n, а именно считывание символа new, которое как make-instance работает