Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > LISP > Лисп на басике |
Автор: wwall 13.10.2006, 16:20 |
В книге Хендерсона Функциональное програмирование, как-то обойден вопрос реализации функции cons. Как эту функцию реализовать на Бесике? Или может кто делал Lisp на бейсике? |
Автор: FatalError 25.10.2006, 16:00 |
Вопрос про Бейсик сложный. Lisp - такой язык, что допускает очень крутые изменения самим юзером, подстройку под себя. Соответственно, конечным результатом вполне может быть нечто вроде Бейсика. Как реальный вариант - язык программирования Euphoria: www.rapideuphoria.com Разработчики чего-то не сознаются, что за основу взяли Lisp, но уши явно торчат: язык интерпретируемый, данные хранятся как атомы с последовательностями... Правда, ОЧЧЕНЬ сильно переделали, надо сказать. Еще можно как пример взять LUA: www.lua.org Это не совсем Бейсик, это скриптовый язык, что-то вроде помеси Лиспа с Паскалем. От Лиспа много больше осталось, чем в Euphoria. Реализация функции cons - тоже, понятно, вопрос не простой. Согласно книжке Турецкого (David S. Touretzky, COMMON LISP: A Gentle Introduction to Symbolic Computation, скачал ее где-то) функция list создает односвязный список ссылок на ячейки памяти, увязанных попарно, причем одна ссылка указывает на данные, а вторая - на следующий элемент списка (следующую пару). Для последнего элемента правильного списка вторая ссылка - nil. Так вот, если я правильно понял, функция cons создает неправильный список ("точечную пару"), в которой обе ссылки указывают на данные. Как сделать односвязный список на Паскале при использовании указателей и динамической памяти, описано в любой книжке про TurboPascal. По аналогии, наверно, можно сделать и в Бейсике. |
Автор: wwall 25.10.2006, 16:40 |
Беда в том что нет динамической памати как таковой. Самому ее приходиться. Все реализации лиспа которые смотрел в той или иной степени используют указатели. На сях это просто, но изобразить его на 1С - непросто. Учитывая что басик наиболее близкий к 1с язык - хотел посмотреть может кто и писал лисп на нем и какую модель представления памяти использовал |
Автор: skyboy 25.10.2006, 17:06 |
wwall, фиг знает этот 1С с бейсиком, но на java можно ведь списки на объектах мутить.. 1С поддерживает работу с объектами? полиморфизм и наследование реализовано? |
Автор: wwall 26.10.2006, 08:16 |
нет. Нет этого. Память сейчас представляю в виде массива (хоть по длине и неограниченом). Проблема на самом деле при построении списка. никак не могу придумать |
Автор: FatalError 27.10.2006, 08:54 |
Вот язык Lua, про который я в прошлом сообщении упомянул, возможно, будет полезен. Он создавался не как самостоятельный язык, а как вспомогательное средство, прикручиваемое к основной программе. Поэтому в нем прописаны крутые возможности взаимодействия с С (ну, поскольку вроде как по факту стандарт программирования). Можно вызывать Lua из С, можно вызывать из Lua функции, написанные на С, и много чего еще. Только Lua - это сильно видоизмененный Lisp, функций вроде cons и list там в явном виде нет, вместо них есть вполне удобный конструктор таблиц (списки в Lua называются таблицами, это практически полный аналог). И функциональность при работе с таблицами у Lua другая, чем у классического Лиспа. Там совсем другой подход реализован, по аналогии с массивами или со структурами в С. Будет ли такая штука взаимодействовать не с С, а с 1С, я не знаю. Если не пойдет, можно попытаться какой-нибудь буфер между ними сделать. |
Автор: wwall 27.10.2006, 13:38 |
Все разобрался. Сам тупил. Спасибо skyboy подсказал. Спасибо всем. Скоро будет очередной трехколесный велосипед.... |
Автор: skyboy 27.10.2006, 13:47 |
wwall, расскажи |
Автор: wwall 27.10.2006, 13:59 | ||
Вот и все. Просто не мог понять очень долго что все лиспе - списки. Список - список, и эмуляция списка - тоже список... И нафиг не нужны указатели, достаточно индекса массива, и в принципе если головой подумать - массив сам тоже не нужен (заменил его на ТаблицуЗначений, есть такой объект в 1С). В добавок ко всему неправльно начал. Решил что проще переписать чужой код, а там ошибок - выше крыши... Как оказалось. Когда начал делать все сам - стало проще. По крайней мере на сегодня (setq x (cons 1 2)) (setq y (cons 3 4)) (setq z (cons x y)) (print z) честно выводит ( ((1 . 2).(3 . 4)) . NIL) Зачем пишу этот интерпретатор - сам не знаю. Есть время. Есть желание. Может кому и потребуется. А заглядывая вперед, просто хочется иметь подомный инструмент под рукой. Хотя бы для прототипирования функций. Реализовать нормально тестирование на 1С - задача не для среднего ума. В отличие от лиспа ![]() Когда закончу, выложу... Кстати, может его сделать по стандарту (точнее максимально близким к стандарту)? Будет ли выгода? |
Автор: skyboy 27.10.2006, 14:14 | ||||
было бы отлично. не знаю. продавать будешь? не знал про таблицу. делал бы на индексах массива ![]()
Молодца! Конечно, потребуется... Я такое полгода назад под J2ME искал. не нашел. ищу время, чтоб начать изучать java - тогда тоже таким займусь ![]() |
Автор: wwall 27.10.2006, 14:33 | ||
Нет. Не того уровня велоспед. Когда научусь подменять интерпретатор 1С на лисп, так что бы вместо внутреннего языка использовался лисп - возможно. Но тут много технических трудностей. Да и не так много людей после басика смогут нормально ориентироваться в лиспе. Сам до сих пор не могу сказать что знаю его хотя бы на троечку, иногда бывает тупо смотрю в чужой код и тихо офигиваю - так тоже можно оказывается написать... А выгода имелось в виду что бы можно было уже готовый код на лиспе в этой поделке использовать... Мечта идиота - прикрутить CLOS... В общем начинаю любить эти тра***тые скобочки. Но очень странною любовью. Кстати, тут в другом топике моя первая поделка по решению задачи на лиспе (перевозка с берега на берег), ради интереса решил переписать на 1С - выглядит убого... Но задачу решает ![]() |
Автор: svg 28.10.2006, 10:35 |
посмотрите на http://ecls.sf.net, он специально создан для таких задач. |
Автор: wwall 30.10.2006, 10:21 |
Посмотрю, спасибо |