Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Geniepro

Страницы: [1] 2 3
1
Любопытная статейка "Как спорить о языках программирования" http://tonsky.livejournal.com/297610.html
Там же по ссылкам "To IDE or not to IDE?" http://tonsky.livejournal.com/231610.html

2
В Университете Карнеги-Меллона заменили курс обучения ООП на ФП у студентов-первокурсников:
https://existentialtype.wordpress.com/2011/03/15/teaching-fp-to-freshmen/
"Teaching FP to freshmen"
Цитировать
Object-oriented programming is eliminated from the introductory curriculum, because it is both anti-modular and anti-parallel by its very nature, and hence unsuitable for our purposes.
"Объектно-ориентированное программирование было изъято из вводного курса, поскольку оно одинаково антимодульно и антипараллельно, и поэтому не годится для целей обучения"

3
Общий раздел / Карманный компьютер Лема
« : Апрель 13, 2014, 04:59:41 pm »
Завёл как-то в чятике разговор про "Карманный компьютер фанатов научной фантастики Станислава Лема", теперь Петрушка всё ждёт, когда я его запрограммирую на жестоком языке под названием Компонентный Паскаль.
Мне пока лень заниматься обработкой строк на языке для этого совершенно не предназначенном, сделал на хацкеле:

import System.Random

data L = L String [L]

земля :: L
земля = L "Земля" [ L "сгорает и"                         все_гибнут
                  , L "замерзает и"                       все_гибнут
                  , L "падает на Солнце и"                все_гибнут
                  , L "учёные" [ L "создают"              мал_огр
                               , L "открывают"            мал_огр ]
                  , L "подвергается нашествию"            мал_огр
                  , L "сталкивается с огромной кометой и" разрушается
                  ]

все_гибнут = [ L "все гибнут"       конец
             , L "почти все гибнут" конец ]

конец = []

мал_огр = [ L "маленьких" существ
          , L "огромных"  существ ]

разрушается = [ L "разрушается"         конец
              , L "не разрушается, но"  все_гибнут
              , L "остаётся невредимой" конец ]

существ = [ L "насекомых"                    которые
          , L "пресмыкающихся"               которые
          , L "роботов"                      которые
          , L "внеземных существ"            которые
          , L "марсиан"                      которые
          , L "селенитов"                    которые
          , L "внегалактических чудовищ"     которые
          , L "различных странных предметов" которые
          ]

которые = [ L "которые" делают_всякое ]

делают_всякое = [ L "желают наших женщин" ((L "похищают их и исчезают"     конец)
                                            : являются)
                , L "ведут себя дружелюбно"                                конец
                , L "ведут себя дружелюбно, но их никто не понимает"       являются
                , L "не понимают нас"                                      являются
                , L "отлично понимают нас"                                 являются
                , L "воспринимают нас только как пищу" ((L "и съедают нас" конец)
                                                         : являются)
                ]

являются = [ L "и являются" [ L "радиоактивными"   и
                            , L "нерадиоактивными" и ] ]

и = [ L "и" [ могут_быть_уничтожены
            , не_могут_быть_уничтожены ] ]

могут_быть_уничтожены =
    L "могут быть уничтожены" [ L "толпой парней с факелами" конец
                              , L армией                     конец
                              , L "атомной бомбой"           конец ]

не_могут_быть_уничтожены =
    L "не могут быть уничтожены" [ L "толпой парней с факелами" но
                                 , L армией                     но
                                 , L "атомной бомбой"           но ]

армией = "сухопутной армией, морским флотом, авиацией, морской пехотой и (или) "
      ++ "войсками береговой охраны"

но = но_учёные : но_парень : но_они

но_учёные = L "но учёные изобретают новое оружие" которое

но_парень = L "но" [ L "один хитрый парень убеждает их  что люди 'OK'" ok
                   , L "священник рассказывает им о Боге"              ok
                   , L "влюбляются в красивую девушку"      (женятся : ok)
                   ]

которое = [ L "которое отказывает"                    но_они
          , L "которое их убивает"                    конец
          , L "которое превращает их в мерзкие глыбы" конец
          ]

ok = [ L "и они умирают"                      конец
     , L "и они улетают"                      конец
     , L "и они превращаются в мерзкие глыбы" конец
     ]

женятся = L "и женятся и живут долго и счастливо" конец

но_они = [ L "но они умирают от чёрной оспы"                                  конец
         , L "и поэтому они убивают нас"                                      конец
         , L "и поэтому они устанавливают систему доброжелательной диктатуры" конец
         , L "и поэтому они съедают нас"                                      конец
         ]

сюжет :: L -> [Int] -> String
сюжет (L str []) _      = str
сюжет (L str vs) (x:xs) = str ++ " " ++ сюжет v xs
  where v = vs !! (x `mod` length vs)

main = do
    stdgen <- getStdGen
    let rs = randomRs (1, 100) stdgen
    putStrLn $ сюжет земля rs

4
Общий раздел / Nimrod: питонопаскаль
« : Февраль 05, 2014, 06:24:19 am »
http://nimrod-lang.org/index.html

Компилируемый (через c (mingw)) язык с синтаксисом от питона и системой типов от объектного паскаля.
От boo отличается нативностью и, вероятно, системой типов.

5
Воронков В.В. "Неправильное введение в функциональное программирование"

Любопытная статья про ФП от автора Ela (динамического ФЯ с хаскелеподобным синтаксисом)...

6
Общий раздел / [Haskell] Промышленный взгляд
« : Сентябрь 20, 2013, 12:19:06 pm »
Haskell в продакте: Отчёт менеджера проекта

Цитата: amarao
...
Продакт в коммерческом проекте — это не в маленькая песочница «для себя», не в академический эксперимент в области Computer Science. Это бесконечная борьба за «линию партии», когда вокруг ад, ужас и погибель, а оно всё равно должно рабоать. Int64 в XML-RPC кодируется строкой (потому что int'ы в XML-RPC signed int32), openssl при чтении нескольких сертификатов из файла читает только первый из них, в bool надо писать либо «1», либо «0», но иногда — «2», ибо только так придумали закодировать третий режим — и т.д. и т.п. В этих условиях требования к языку постепенно перерастают в требования к его экосистеме, инфраструктуре, готовности адаптироваться к реальному миру.

Я буду писать о Haskell с позиций product owner'а, менджера проекта, системного администратора, но никак не программиста. Так что не ожидайте от меня задушевных восторгов о том, как изящно через монадки можно сделать семигрупоид и как здорово выводить типы через типы с помощью типов.

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

7
Общий раздел / Типы в языках программирования
« : Сентябрь 04, 2013, 01:39:21 pm »
Перевод весьма известной книги:

Типы в языках программирования. Бенджамин Пирс

8
Начал писать руководство по стилю кодирования. За образец взял документ Ada Quality and Style Guide, pdf-версия которого содержит 377 страниц.
Подумал -- ну, Обероне же проще Ады, так что страниц будет намного меньше...

Ну, начало положено, дальше продолжу...

9
Общий раздел / Generic Oberon
« : Август 28, 2013, 06:44:33 am »
Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))

С динамическими массивами все понятно, а про дженерики много разговоров, но пока я не видел описание синтаксиса и семантики дженериков для оберона. Возможно, следует обсудить синтаксис и семантику дженериков (я в этом вопросе слабо разбираюсь).

Ну как вариант -- как-то так:

Lightweight Parametric Polymorphism for Oberon (Paul Roe and Clemens Szyperski)
Цитировать
By combining Oberon's inclusion polymorphism (subtyping) with parametric polymorphism, the map procedure can be abstracted to work for entire families of collections, not only lists.
TYPE Ptr(A) = POINTER TO A;

TYPE Proc(A) = PROCEDURE (x: Ptr(A));

TYPE Collection(A) = Ptr(CollectionDesc(A));
     CollectionDesc(A) = RECORD
        elem: Ptr(A)
     END;

     List(A) = Ptr(ListDesc(A));
     ListDesc(A) = RECORD (CollectionDesc(A))
        next: List(A)
     END;

     Tree(A) = Ptr(TreeDesc(A));
     TreeDesc(A) = RECORD (CollectionDesc(A))
        left, right: Tree(A)
     END;

PROCEDURE <A> (c: Collection(A)) Map (p: Proc(A));
BEGIN p(c.elem)
END Map;

PROCEDURE <A> (l: List(A)) Map (p: Proc(A));
BEGIN
  l.Map^(p); (* "super call" to overridden procedure *)
  IF l.next # NIL THEN l.next.Map(p) END
END Map;

PROCEDURE <A> (t: Tree(A)) Map (p: Proc(A));
BEGIN
  IF t.left  # NIL THEN t.left.Map(p)  END;
  l.Map^(p);
  IF t.right # NIL THEN t.right.Map(p) END
END Map;
For example, it is now possible to abstractly map Rotate over a collection of points Collection(PointDesc), regardless of whether the collection is actually a list, a tree, or any other structure derived from the base type Collection(A).

10
То, что вы не хотели знать об Англии
Автор Алексей Лукьяненко – в недавнем прошлом успешный латвийский бизнесмен, который, как и многие другие, потерпел крах в кризис 2008 года, был вынужден уехать в Великобританию и начать свою деятельность с самых низов.

Цитата: Алексей Лукьяненко
От автора: Любые совпадения с реальными событиями или людьми, прошу считать случайностью.

 Я никогда не думал, что окажусь в такой ситуации. Я часто слышал о том, что многие уезжают, и знал многих, кто уехал. Но я никогда не думал, что поеду сам.

 Большую часть моей жизни, у меня был свой, вполне успешный бизнес, я много работал, и много чем занимался, и всегда находил выход из самых тяжелых ситуаций. Но жизнь распорядилась иначе. Как ни старался, я не смог противостоять той обстановке, которая сложилась в моей стране. Сложилась... Или сложили... За полтора года, проведенных в Англии, я пришел к выводу, что она сложилась отнюдь не сама по себе. И об этом я пишу сейчас. А на тот момент я отправлялся в удивительную страну, о которой написано огромное количество книг и снято огромное количество фильмов. Где живут удивительные люди, про которых слагают легенды, и пишут гимны. Где все хорошо, и где все счастливы. Где производят самые лучшие товары, и где толерантность и демократия стоят во главе угла. Понятное дело, что создать свой бизнес там, с первого дня, без начального капитала - это утопия. Поэтому придется стартовать простым рабочим на каком-нибудь заводе. А потом разберемся. Говорят, что у них там все проще, чем у нас. Итак, вперед!!!

...

105.Подводя итог, я хотел бы высказать мое субъективное мнение о ситуации в целом. Находясь в Латвии, мы представляем себе Английский остров, как некое сказочное место. Где нас любят, ждут и только мечтают нас встретить, расцеловать у трапа самолета и дать нам любимую работу за огромные деньги. Там нас ждёт доступное жилье, дешёвые машины, приветливые люди, и невиданные перспективы роста. Это великолепный миф, созданный не знаю кем, но в принципе догадываюсь. Я догадываюсь, кто и зачем направо и налево раздавал здесь кредиты, зачем людям дали возможность вставить голову в петлю, а потом взяли за эту верёвку и отвели на рабочее место. Только уже не около родного дома, а где-то в Европе. Зачем создана эта убийственная экономическая ситуация, зачем сравниваются с землёй заводы и фабрики. А я скажу зачем. Потому, что стремительно стареющая Европа не в состоянии вытянуть свои производственные мощности, и содержать своих пенсионеров, привыкших к хорошей и обеспеченной жизни. Европе нужна рабочая сила и налогоплательщики. А как их привлечь? Очень просто. Надо открыть рынок труда, и принять в Еврозону страны, где еще остались рукастые и головастые кадры, а потом создать внутри этих стран невыносимую экономическую обстановку. Это ведь нетрудно. Нужно только продвинуть несколько нужных решений в Брюсселе, по просьбе некоторых «высокоразвитых» стран, которые приняли у себя несметное количество бездельников из своих бывших и настоящих колоний. А теперь схватились за голову, потому что те, никогда не работали у себя, и не планируют это начинать по приезду. Своя рабочая сила постепенно выходит на пенсию, а заменить ее реально некем. Поэтому надо что-нибудь пообещать нам, приведенным в скотское состояние, и мы сами побежим к ним. И будем с благодарностью целовать им руки. Работать за себя и за них на их заводах, платить налоги, обогащать их владельцев недвижимости, платя невиданные аренды за убогое жилье, оплачивать нереальные страховки, отдавать бешеные деньги за связь, коммуникации и электричество. В конце концов, кто-то же должен это делать. Ну и конечно, содержать своими налогами всех мнимых безработных, к которым они испытывают моральные страдания по поводу их предыдущей колонизации. В четвертом «Крепком орешке», Брюс Уиллис спасал США, где компьютерщики обрушили экономику страны. Однажды, на каком-то застолье я пошутил:

 - Я знаю, как обрушить экономику Великобритании.

 - Ну и как? – спросили меня.

 - Надо сделать так, чтобы в один день все эмигранты не вышли на работу. Это будет конец.

 Все рассмеялись. А ведь на самом деле, у нас на предприятии, реально работала половина поляков, плюс прибалты. И давайте предположим, что будет с заводом, если из 1800 человек половина утром не прийдет?

106.Я очень хорошо понимаю, что многие люди, здесь у нас, доведены до ужасного состояния, и что вынуждены ехать туда, потому что там, после оплаты всех счетов, хотя бы остаются деньги на покушать, одеться и, может быть, даже купить какую-нибудь недорогую машинку. Хотя в Англии, я знал наших ребят, которые после оплаты счетов и выплаты месячной ставки по взятому когда-то в Латвии кредиту, жили семьёй из четырёх человек на 8 фунтов в неделю. Я никого не агитирую и никого не отговариваю, я просто рассказал свою историю, для того, чтобы у тех, кто только собирается туда, было реальное представление о ситуации, а не розовый туман в голове, после хвалебных песен наших и не наших соотечественников на форумах, по принципу «Каждая лягушка свое болото хвалит». Ведь о трудностях и проблемах, в основном, не пишет никто. Все только хвастаются, что они теперь живут в Англии и это круто. Круто – относительно Латвии, относительно Англии, это уже спорный вопрос. Поэтому, в любом случае, нужно отдавать себе отчет в том, что мы там чужие, и быть готовым с достоинством встретить новую нелегкую жизнь.

11
Ещё об индустриализации профессий
Цитата: scholar_vit
Комментируя мою предыдущую запись, pigbig указала на идеи Ритцера о Мак-Дональдизации общества (см. изложение концепции в рецензии на книгу Ритцера).

 Книгу я ещё почитаю, но подмеченное автором стремление к воспроизводимости и предсказуемости мне кажется очень интересными наблюдением. При этом, если верить рецензенту, эта предсказуемость становится не средством, а целью: "Не надо лучше, надо по правилам!"

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

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

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

 См. мультипликационную заставку к "Иронии судьбы".

12
Общий раздел / [OberonJS] Мнения
« : Июль 26, 2013, 06:18:44 am »
OberonJS - отказать.
Цитата: Дважды мудак
Посмотрел я на http://oberspace.dyndns.org/oberonjs.html
MODULE test;
IMPORT JS;
 
PROCEDURE Foo*;
VAR a : ARRAY 10 OF REAL;
BEGIN
  JS.alert("Hello, World!")
END Foo;


BEGIN
   
END test.
Транслируется в:
var RTL$ = {
    makeArray: function (/*dimensions, initializer*/){
        var forward = Array.prototype.slice.call(arguments);
        var result = new Array(forward.shift());
        var i;
        if (forward.length == 1){
            var init = forward[0];
            if (typeof init == "function")
                for(i = 0; i < result.length; ++i)
                    result[i] = init();
            else
                for(i = 0; i < result.length; ++i)
                    result[i] = init;
        }
        else
            for(i = 0; i < result.length; ++i)
                result[i] = this.makeArray.apply(this, forward);
        return result;
    }
};
var JS = function(){return this;}();
var test = function (){

function Foo(){
var a = RTL$.makeArray(10, 0);
JS.alert("Hello, World!");
}
}();
По пунктам:

1. человекочитаемый выходной код - есть (идентификаторы сохраняются)
2. старый дизайн выходного кода - нет (отличается семантика массивов, из-за чего появляется шлак в виде RTL$ вместо new Array(10))
3. новая система типов - есть*
4. новый синтаксис - есть*
5. компактный новый язык - есть*

* - но это же 1950-е годы, Алгол-58

По списку - [1,3,4,5]

Это было в продолжение его поста "HNC и Javascript":
Цитата: Дважды мудак
Внезапно у моего вечно мертвого HNC появилось второе после сей поле для применения: Javascript. С и JS оба а) неизбежны в своих областях применения б) убоги.

Интересно, однако, что если при компиляции в Си среди конкурентов имеем сплошь страх и ужас (генерация неидиоматического кода, попытки изменить семантику), при компиляции в JS всё не так плохо: некоторые изобретатели языков, компилирующихся в JS, осознают необходимость генерировать на выходе качественный код, а не кашу.

Также интересно, что предпринимаются попытки и выделить каноническое подмножество старого языка, правда, только в виде замены 100500 возможных в JS объектных моделей на захардкоженную в кодогенератор одну каноническую. Например, декларации классов в CoffeeScript и MS TypeScript.

Вот мне интересно, есть ли языки, компилирующихся в JS и удовлетворяющие требованиям:

1. человекочитаемый выходной код
2. старый дизайн выходного кода (никаких остающихся на выходе ленивостей, алгебраиков, гигантских говнорантаймов, идиотского кода вроде f.call(null) и хуй-эр-пэ)
3. новая система типов
4. новый синтаксис
5. компактный новый язык

Coffeescript - [1, 2, 4]
TypeScript - [1, 2, 3]
Ur, Fay, Roy, Elm, Haxe, Agda, Idris - [3, 4, 5]
ClosureScript - [4, 5]
Erlang JavaScript compiler - [1, 2, 4, 5]
OberonJS - [1, 3, 4, 5]

Кто-нибудь ещё что-нибудь стоящее внимания знает из 100500 языков в списке?

Пока получается, что 2 плохо дружит с 5.

13
Общий раздел / Цепной quine на 50 языках
« : Июль 17, 2013, 08:08:09 am »
Какой-то сумасшедший программист из Японии написал серию из 50 программ, при выполнении любой из которых получается исходный код следующей программы в цепочке:

https://dl.dropboxusercontent.com/u/2243964/QR.zip

Эстафета из 50-ти квайнов

Цитировать
Квайн — компьютерная программа, которая выдаёт на выходе точную копию своего исходного текста. Японский рубист Юсукэ Эндо (Yusuke Endoh) создал нечто невероятное. Quine Relay — программа на Ruby, которая генерирует код программы на Scala, которая генерирует код программы на Scheme, которая генерирует… и так далее на 50-ти языках программирования, пока программа на REXX снова не генерирует изначальный код на Ruby.

Если присмотреться к исходникам, то можно заметить что там походу в каждом исходнике перемешаны исходники на остальных языках.
Интересно, он генерировал эти программы каким-то генератором?

14
Общий раздел / О важности generics/templates
« : Июль 16, 2013, 11:53:39 am »
"Интервью с создателем C++ STL, 1995 г." часть 1, часть 2

Цитата: Александр Степанов
Вместе с Дейвом Мюссером мы начали работу над созданием Ada-библиотеки. Это было существенным обстоятельством, т.к. переключение с динамически типизированного языка, такого как Scheme, к строго типизированному языку, такому как Ada, позволило мне осознать важность строгой типизации. Все понимают, что строгая типизация помогает в поиске ошибок. Я обнаружил, что строгая типизация в контексте дженериков языка Ada (обобщённых процедур — т.е. применимых к любому типу), также являлась инструментом выявления моделей. Она являлась не только инструментом для вылавливания ошибок. Она также была инструментом для размышления. Эта работа привела меня к идее ортогональной декомпозиции пространства компонентов. Я осознал, что программные компоненты принадлежат разным категориям. Приверженцы ООП думают, что всё является объектом. Когда я работал над обобщённой библиотекой для Ada, я осознал, что это не так. Есть вещи, являющиеся объектами. Вещи, которые имеют состояние и изменяют свое состояние, являются объектами. И в то же время существуют вещи, не являющиеся объектами. Бинарный поиск — это не объект. Это алгоритм. Более того, я осознал, что, декомпозируя пространство компонентов на несколько ортогональных измерений, мы можем уменьшить число компонентов, и, что более важно, мы можем предоставить концептуальную основу того, как проектировать что-либо.

Затем мне была предложена работа в Лаборатории Белла в группе языка C++ над библиотеками C++. Они спросили меня, мог бы я сделать то же на C++. Конечно, я не знал C++, и конечно же я ответил согласием. Но я не мог сделать этого на C++, т.к. в 1987 г. C++ не имел шаблонов, которые необходимы для этого стиля программирования. Наследование было единственным механизмом для получения обобщённости, и он не был достаточным.

 Даже сейчас наследование в C++ не представляет особой ценности для обобщённого программирования. Давайте обсудим, почему. Многие пытались использовать наследование для реализации структур данных и контейнерных классов. Как нам известно теперь, было очень мало успешных попыток, если таковые вообще были. Наследование C++ и стиль программирования, связанный с ним, являются существенно ограниченными. Так, в нём невозможно реализовать дизайн, который включает такую простую вещь, как использование оператора сравнения на равенство. Если вы начинаете с базового класса X в качестве корня вашей иерархии и определяете для этого класса виртуальный оператор сравнения на равенство, получающий аргумент типа X, то далее унаследуйте класс Y от X. Каков интерфейс оператора сравнения на равенство? Он имеет равенство, которое сравнивает Y с X. Используя в качестве примера животных (объектно-ориентированные люди любят животных), определите «млекопитающее» и унаследуйте «жирафа» от млекопитающего. Затем определите функцию-член «спариваться», в которой одно животное спаривается с другим и возвращает животное. Затем вы выводите «жирафа» из животного и, конечно, он имеет функцию «спариваться», в которой жираф спаривается с животным и возвращает животное. Это определенно не то, что вам бы хотелось. В то время как спаривание может быть не очень важным для C++-программистов, оператор равенства является таковым. Я не знаю ни одного алгоритма, в котором не использовалась бы некоторая разновидность сравнения на равенство.

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

15
Общий раздел / [Oberon7] "Man or Boy test" by Donald Knuth
« : Июль 04, 2013, 08:58:57 pm »
"Man or boy?" Donald Knuth

http://rosettacode.org/wiki/Man_or_boy_test

Попробовал решение для онлайн-компилятора Оберона-7:
MODULE test;
IMPORT JS;

TYPE Function = PROCEDURE ():INTEGER;

PROCEDURE F0():  INTEGER; BEGIN RETURN  0 END F0;
PROCEDURE F1():  INTEGER; BEGIN RETURN  1 END F1;
PROCEDURE Fn1(): INTEGER; BEGIN RETURN -1 END Fn1;

PROCEDURE A(ink: INTEGER; x1, x2, x3, x4, x5: Function): INTEGER;
VAR
  res : INTEGER;
  k   : INTEGER;

  PROCEDURE B(): INTEGER;
  BEGIN
    DEC(k);
    RETURN A(k, B, x1, x2, x3, x4)
  END B;

BEGIN
  k := ink;
  IF k <= 0 THEN
    res := x4() + x5();
  ELSE
    res := B();
  END;
  RETURN res
END A;

BEGIN
    JS.alert(A(10, F1, Fn1, Fn1, F1, F0))
END test.

а он мне раз и заявил: "Нельзя, мол, ссылаться на локальную процедуру"!
Компилятор от akron1 с ним солидарен...

Я что-то запямятовал -- в Обероне-7 действительно есть такое ограничение?
Если есть, значит для Оберона-7 нельзя сделать "взрослый" компилятор (Man)? Язык вынуждает компиляторы быть "детскими" (Boy)?

ЗЫ. Ну и моё решение для хацкеля (зря что ли его делал):
import Data.IORef
import Control.Monad

main = do
    k <- newIORef 10
    print =<< a k (return 1) (return (-1)) (return (-1)) (return 1) (return 0)

a in_k x1 x2 x3 x4 x5 = do
    k <- newIORef =<< readIORef in_k
    let b = do
            k `modifyIORef` (\x -> x-1)
            a k b x1 x2 x3 x4

    k' <- readIORef k
    if k' <= 0 then liftM2 (+) x4 x5 else b

Страницы: [1] 2 3