Как я должен управлять побочными эффектами в новом дизайне языка?

Это может работать для вас (GNU sed):

sed 's/\(.*│\)\s*└──.*/&\n\1/' file

Где файл может быть stdin из канала команды дерева, например

tree -Fa --dirsfirst helloworld | sed 's/\(.*│\)\s*└──.*/&\n\1/'
6
задан Norman Ramsey 29 April 2009 в 23:16
поделиться

4 ответа

Серьезно рассмотрите Clojure и их использование программной транзакционной памяти, агентов и атомов для контроля побочных эффектов.

0
ответ дан 17 December 2019 в 00:14
поделиться

A side effect is having any effect on anything in the world other than returning a value, i.e. mutating something that could be visible in some way outside the function.

A pure function neither depends on or affects any mutable state outside the scope of that invocation of the function, which means that the function's output depends only on constants and its inputs. This implies that if you call a function twice with the same arguments, you are guaranteed to get the same result both times, regardless of how the function is written.

If you have a function that modifies a variable that it has been passed, that modification is a side effect because it's visible output from the function other than the return value. A void function that is not a no-op must have side effects, because it has no other way of affecting the world.

The function could have a private variable only visible to that function that it reads and modifies, and calling it would still have the side effect of changing the way the function behaves in the future. Being pure means having exactly one channel for output of any kind: the return value.

It is possible to generate random numbers purely, but you have to pass around the random seed manually. Most random functions keep a private seed value that is updated each time its called so that you get a different random each time. Here's a Haskell snippet using System.Random:

randomColor              :: StdGen -> (Color, Int, StdGen)
randomColor gen1         = (color, intensity, gen2)
 where (color, gen2)     = random gen1
       (intensity, gen3) = randomR (1, 100) gen2

The random functions each return the randomized value and a new generator with a new seed (based on the previous one). To get a new value each time, the chain of new generators (gen1,gen2,gen3) have to be passed along. Implicit generators just use an internal variable to store the gen1.. values in the background.

Doing this manually is a pain, and in Haskell you can use a state monad to make it a lot easier. You'll want to implement something less pure or use a facility like monads, arrows or uniqueness values to abstract it away.

Getting the system time is impure because the time could be different each time you ask.

Sleeping is fuzzier because sleep doesn't affect the result of the function, and you could always delay execution with a busy loop, and that wouldn't affect purity. The thing is that sleeping is done for the sake of something else, which IS a side effect.

Memory allocation in pure languages has to happen implicitly, because explicitly allocating and freeing memory are side effects if you can do any kind of pointer comparisons. Otherwise, creating two new objects with the same parameters would still produce different values because they would have different identities (e.g. not be equal by Java's == operator).

I know I've rambled on a bit, but hopefully that explains what side effects are.

1
ответ дан 17 December 2019 в 00:14
поделиться

Проблема описания и управления эффектами в настоящее время занимает одни из лучших научных кругов в языках программирования, включая таких людей, как Грег Моррисетт из Гарвардского университета. Насколько мне известно, самая амбициозная новаторская работа в этой области была проделана Дэвидом Гиффордом и Пьером Жувело на языке программирования FX, начатом в 1987 году. Определение языка доступно в Интернете, но вы можете лучше понять идеи прочитав их статью 1991 года POPL .

4
ответ дан 17 December 2019 в 00:14
поделиться

Это действительно интересный вопрос, и он представляет собой один из этапов, которые я прошел и, честно говоря, вышел за его пределы.

Я помню семинары, на которых Карл Хьюитт, говоря о Актеры его формализма обсуждали это. Он определил его в терминах метода, дающего ответ, который был исключительно функцией его аргументов или который мог бы давать разные ответы в разное время.

Я говорю, что я вышел за пределы этого, потому что он делает сам язык (или вычислительную модель основной предмет, в отличие от проблем, которые он должен решить. Он основан на идее, что язык должен иметь формальную базовую модель, чтобы его свойства легко проверялись. Это хорошо, но все еще остается отдаленной целью, потому что до сих пор не существует языка (насколько мне известно), в котором правильность чего-то такого простого, как пузырьковая сортировка, легко доказать, не говоря уже о более сложных системах.

Вышесказанное является хорошей целью, но Я пошел в направлении поиска информационных систем в терминах теории информации . В частности, предполагая, что система начинается с совокупности требований (на бумаге или у кого-то в голове), эти требования могут быть переданы на пишущую машину (автоматическую или автоматическую) для генерации исходного кода для работающей реализации. ПОСЛЕ ТОГО, как происходят изменения в требованиях, эти изменения обрабатываются как дельта-изменения исходного кода реализации.

Тогда возникает вопрос: Какие свойства исходного кода (и язык, на котором он кодируется) облегчают этот процесс? Очевидно, что это зависит от типа решаемой проблемы, от того, какие данные входят и выходят (и , когда ), как долго должна храниться информация и какая обработка должна быть выполнена на ней. , Из этого можно определить формальный уровень языка, необходимого для этой проблемы.

Я понял, что процесс запуска через дельта-изменения требований к исходному коду упрощается, так как формат кода больше похож на , похож на требований, и существует хороший количественный способ измерить это сходство не с точки зрения поверхностного сходства, а с точки зрения действий редактирования. Хорошо известная технология, которая лучше всего выражает это, - это доменные языки (DSL). Итак, я осознал, что больше всего я ищу в языке общего назначения возможность создавать языки специального назначения.

В зависимости от приложения такие языки специального назначения могут или не могут нуждаться в определенных формальных функциях, таких как функциональные нотация, управление побочными эффектами, паралеллизм и т. д. Фактически, существует много способов сделать язык специального назначения, от синтаксического анализа, интерпретации, компиляции, вплоть до простых макросов в существующем языке, вплоть до простого определения классов, переменных, и методы на существующем языке. Как только вы объявляете переменную или подпрограмму, вы создаете новый словарь и, таким образом, новый язык для решения вашей проблемы. На самом деле, в этом широком смысле, я не думаю, что вы можете решить какую-либо проблему программирования , не , на каком-то уровне, являясь дизайнером языка.

Так что удачи,

2
ответ дан 17 December 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: