LINUX.ORG.RU

Изменение функций на лету.

 , , пятница послезавтра,


0

2

Чистая функция - детерминированная и не обладающая побочными действиями.
Пусть чистая функция A не меняет аргументов, но вызывает какие-то другие функции, пусть B. Если в процессе работы B каким-либо образом измениться, то функция А перестанет быть чистой, не так?
Возможно ли в каком-нибудь языке такое, не рассматривая баги в интерпретаторе?

★★★★

Последнее исправление: CYB3R (всего исправлений: 3)

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

По идее то да.
Имеется ли в каком-нибудь языке возможность такого бага, пусть не фп уже будет.

aptyp ★★★★
() автор топика

Если в процессе работы B каким-либо образом измениться

что вы понимаете под изменением функции?

Deleted
()

Не совсем понятно в чём дело. Передавай функцию B параметром и всё.

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

Это способ сделать из чистой функции, функцию чистота которой будет зависеть от параметров, точнее от чистоты переданной в параметры функции, на это можно делать пытки в аду.

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

Всё зависит по каким правилам мы играем. Если для функции B установлены ограничения на чистоту и входные, выходные параметры, то все такие функции welcome.

anonymous
()

Эм... Monkey Patching, metaprogramming - не то? Что же касается вопросов о чистоте - вроде как был великий спор о чистоте IO в Haskell и там обсуждалась возможно реализации чистой функции принимающей на вход нечистую функцию.

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

чистой функции принимающей на вход нечистую функцию.

здравствуйте,

тут точно про программирование а не одну из религий?

Turbid ★★★★★
()

Для Rust планируется что-то похожее.

tailgunner ★★★★★
()

в Haskell (в частности) для того, чтобы такого не происходило, есть монада IO; тем не менее, существуют обходные пути

при чём тут замена на лету я, честно говоря, не понял - это, в общем-то, такое же IO, как и любой другой сайд-эффект

jtootf ★★★★★
()
Ответ на: комментарий от monk

Можно пример кода?
Понимаю, что можно на лету создать функцию с CL, а вот переопределить, такого не видел.

aptyp ★★★★
() автор топика
Ответ на: комментарий от TheKnight

О, нагуглил. То, что надо.

aptyp ★★★★
() автор топика
Ответ на: комментарий от aptyp

Понимаю, что можно на лету создать функцию с CL, а вот переопределить, такого не видел.

Переопределение на-лету - это основной метод разработки на лиспе. Я беру LispWorks, который при запуске создает новый чистый «образ». Загружаю asdf. Затем через asdf загружаю свой код в образ через функцию load-system. Теперь можно работать. Далее беру любой текстовый файл из своего кода и загружаю его в редактор. Как только изменяю что-то или добавляю новое определение, функцию ли, класс ли, структуру ли, сразу нажимаю на кнопку «Compile Definition», которое компилирует только *текущую форму*.

Здесь нет привычного по другим языкам цикла отредактировал - скомпилировал - запустил. В лиспе все происходит мгновенно. Отредактировал - и тут же перекомпилировал изменение. Можно при работающей программе. Полную перекомпиляцию приходится запускать очень редко, да и это неудобно, поскольку надо начинать с нового образа.

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

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

Можно ли в процессе работы другой функции вызываемую ей переопределить, чтобы она сразу *вклинилась*?

aptyp ★★★★
() автор топика
Ответ на: комментарий от aptyp

Скорее всего, да. Вероятно, она «вклинивается», но с некоторыми оговорками, что в вызывающей функции не происходит кеширования, что адрес старой функции не сохраняется и тому подобного.

Это можно проверить экспериментально. Сейчас написал простенький пример:

(defun f () (break) (g))
(defun g () 1)

Я запускаю f. В ответ по break вываливаются рестарты. В это время я меняю g:

(defun g () 2)

Затем продолжаю выполнение прерванной функции f. В итоге получаю ответ 2. То есть, во время выполнения функции f я переопределил функцию g, и была задействована новая версия g.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от Turbid

Точно. А теперь открой яндекс, или хотя бы Майл и поищи, что такое чистая функция в контексте программирования и чем она отличается от нечистой. Дабы после не задавать глупые вопросы.

TheKnight ★★★
()
Ответ на: комментарий от dave

Интересно. А поддерживают ли такую работу другие реализации CL? И более широкий вопрос - есть ли что-то подобное в других вариантах лиспа?

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

A few implementations don't provide ASDF yet, but have announced they will in their next release. As for remaining implementations, they are obsolete and/or mostly unmaintained; still ASDF 2 supports them if you load it manually, though there might never be a next release to provide it through require.


Или не от asdf эта фича зависит?

aptyp ★★★★
() автор топика
Ответ на: комментарий от ovk48

А поддерживают ли такую работу другие реализации CL?

Да.

korvin_ ★★★★★
()
Ответ на: комментарий от ovk48

Все известные мне распространенные реализации CL поддерживают такую инкрементальную разработку либо через собственную IDE (lispworks, allegro cl), либо через emacs + slime (lispworks и allegro cl тоже можно использовать через emacs).

Тут фишка в том, что на самом лиспе определены функции, которые в живую работают с образом. Они удаляют, меняют, добавляют, загружают или компилируют определения. По большому счету они ничем не отличаются от тех функций, что определяет пользователь в своей программе. Эти функции можно вызвать вручную через REPL, но их может вызвать и лисповая IDE или slime.

По-моему очень похожее есть для clojure, но точно не знаю. Вероятно, там тоже emacs и какой-нибудь аналог slime.

Про другие лиспы не скажу.

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

dave ★★★★★
()
Ответ на: комментарий от ovk48

уважаемый поначалу все лиспы были позднего связывания(т.е в момент обращения к имени происходил выяснение(поиск) что за функция и её запуск

там ещё поиск был не как у людей :) ( тобиш современно привычный - в лексический порядке) а в динамическом контекстве что тянет за собой тонны лулзов и нюансов реализации.

приснопяматный scheme частичто тем и известен что скрестил лиспову чистоту (уж какая есть ) с алголовской семантикой связывания ( статическая(для динамической потребны отдельные ужимки) и порядка просмотра контекста для определение какое полное имя подразумевается при упоминании имени без полного пути.)

qulinxao ★★☆
()
Ответ на: комментарий от dave

Нет, я со slime игрался, я понимаю, что с запущенным лиспом можно сделать evaluate в емаксе, и новое определение функции заменит старое или добавится. Это все простые вещи. Я имел в виду в основном работу с образами. Я могу например записать снимок образа произвольного размера со всеми данными и функциями в файл или загрузить из файла? Или выгрузить часть образа в другой образ или на диск? Еще интересно, как насчет многопользовательской работы с одним и тем же образом - как можно подключаться? Ну и т.д.

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

Образ - это по сути твой экземпляр лисп-машины. Там можно менять код. Обычно когда записывается образ на диск, лисп-машина затем сразу же вырубается. В лиспворксе, вообще, запускается отдельный экземпляр лисп-машины только для создания образа. Дальнейшая загрузка образа с диска - это просто запуск лисп-машины. Вообще, большинство лиспов (кроме abcl ?) распространяются как уже сохраненные на диск образы.

Что касается многопользовательского подключения к образу, то, вероятно, можно (swank ?). Точно можно удаленно подключиться. Да и какая разница, какой пользователь, если есть возможность удаленного подключения?

Причем образ сам по себе не хранит исходников кода в отличие от smalltalk (хотя кое-где видны отголоски идеи хранить и исходники). В лиспе образ - это код и сериализованное состояние переменных.

dave ★★★★★
()
Ответ на: комментарий от aptyp

А что со смолтоком?

Там код хранится в самом образе, а не в файлах.

dave ★★★★★
()
Ответ на: комментарий от ovk48

Тут есть еще до кучи скомпилированные файлы, которые могут быть загружены в образ. Они похожи на объектники в си или си++.

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