![]() |
|
![]() ![]() ![]() |
|
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
В книге Хендерсона Функциональное програмирование, как-то обойден вопрос реализации функции cons. Как эту функцию реализовать на Бесике? Или может кто делал Lisp на бейсике?
|
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Вопрос про Бейсик сложный. 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 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
Беда в том что нет динамической памати как таковой. Самому ее приходиться.
Все реализации лиспа которые смотрел в той или иной степени используют указатели. На сях это просто, но изобразить его на 1С - непросто. Учитывая что басик наиболее близкий к 1с язык - хотел посмотреть может кто и писал лисп на нем и какую модель представления памяти использовал |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
wwall, фиг знает этот 1С с бейсиком, но на java можно ведь списки на объектах мутить.. 1С поддерживает работу с объектами? полиморфизм и наследование реализовано?
|
|||
|
||||
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
нет. Нет этого. Память сейчас представляю в виде массива (хоть по длине и неограниченом). Проблема на самом деле при построении списка. никак не могу придумать
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Вот язык Lua, про который я в прошлом сообщении упомянул, возможно, будет полезен. Он создавался не как самостоятельный язык, а как вспомогательное средство, прикручиваемое к основной программе. Поэтому в нем прописаны крутые возможности взаимодействия с С (ну, поскольку вроде как по факту стандарт программирования). Можно вызывать Lua из С, можно вызывать из Lua функции, написанные на С, и много чего еще. Только Lua - это сильно видоизмененный Lisp, функций вроде cons и list там в явном виде нет, вместо них есть вполне удобный конструктор таблиц (списки в Lua называются таблицами, это практически полный аналог). И функциональность при работе с таблицами у Lua другая, чем у классического Лиспа. Там совсем другой подход реализован, по аналогии с массивами или со структурами в С. Будет ли такая штука взаимодействовать не с С, а с 1С, я не знаю. Если не пойдет, можно попытаться какой-нибудь буфер между ними сделать.
|
|||
|
||||
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
Все разобрался. Сам тупил. Спасибо skyboy подсказал. Спасибо всем. Скоро будет очередной трехколесный велосипед....
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
wwall, расскажи
|
|||
|
||||
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
Вот и все. Просто не мог понять очень долго что все лиспе - списки. Список - список, и эмуляция списка - тоже список... И нафиг не нужны указатели, достаточно индекса массива, и в принципе если головой подумать - массив сам тоже не нужен (заменил его на ТаблицуЗначений, есть такой объект в 1С). В добавок ко всему неправльно начал. Решил что проще переписать чужой код, а там ошибок - выше крыши... Как оказалось. Когда начал делать все сам - стало проще. По крайней мере на сегодня (setq x (cons 1 2)) (setq y (cons 3 4)) (setq z (cons x y)) (print z) честно выводит ( ((1 . 2).(3 . 4)) . NIL) Зачем пишу этот интерпретатор - сам не знаю. Есть время. Есть желание. Может кому и потребуется. А заглядывая вперед, просто хочется иметь подомный инструмент под рукой. Хотя бы для прототипирования функций. Реализовать нормально тестирование на 1С - задача не для среднего ума. В отличие от лиспа ![]() Когда закончу, выложу... Кстати, может его сделать по стандарту (точнее максимально близким к стандарту)? Будет ли выгода? Это сообщение отредактировал(а) wwall - 27.10.2006, 14:01 |
|||
|
||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
было бы отлично. не знаю. продавать будешь? не знал про таблицу. делал бы на индексах массива ![]()
Молодца! Конечно, потребуется... Я такое полгода назад под J2ME искал. не нашел. ищу время, чтоб начать изучать java - тогда тоже таким займусь ![]() |
||||
|
|||||
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
Нет. Не того уровня велоспед. Когда научусь подменять интерпретатор 1С на лисп, так что бы вместо внутреннего языка использовался лисп - возможно. Но тут много технических трудностей. Да и не так много людей после басика смогут нормально ориентироваться в лиспе. Сам до сих пор не могу сказать что знаю его хотя бы на троечку, иногда бывает тупо смотрю в чужой код и тихо офигиваю - так тоже можно оказывается написать... А выгода имелось в виду что бы можно было уже готовый код на лиспе в этой поделке использовать... Мечта идиота - прикрутить CLOS... В общем начинаю любить эти тра***тые скобочки. Но очень странною любовью. Кстати, тут в другом топике моя первая поделка по решению задачи на лиспе (перевозка с берега на берег), ради интереса решил переписать на 1С - выглядит убого... Но задачу решает ![]() Это сообщение отредактировал(а) wwall - 27.10.2006, 14:38 |
|||
|
||||
svg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: 14 Всего: 18 |
посмотрите на ECL, он специально создан для таких задач.
|
|||
|
||||
wwall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.9.2006 Репутация: 3 Всего: 4 |
Посмотрю, спасибо
|
|||
|
||||
![]() ![]() ![]() |
Правила форума LISP | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | LISP | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |