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

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


Сообщения - Geniepro

Страницы: 1 ... 128 129 [130] 131
1936
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 06:24:41 am »
А что Вы подразумеваете под функциями высшего порядка? Полиномы N-ой степени?  :)
Функции, оперирующие другими функциями.

1937
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 06:44:08 pm »
Это же Хаскелл!  ;D
К сожалению (или к счастью), я - убеждённый императивщик.  :-) Во всяком случае, пока.
Хех, так ведь один из авторов Хаскелла (Simon Peyton Jones) утверждает, что:
- "Хаскелл: прекраснейший в мире императивный язык программирования"

1938
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 04:36:25 pm »
Проблему, на мой взгляд, можно решить введя в язык следующие правила:
1. Внутри функции глобальные (по отношению к ней) переменные доступны только для чтения.
2. Параметры, передаваемые в функцию по ссылке, доступны внутри функции только для чтения.
3. Внутри функции запрещено использовать вызов процедур.

И хватит благостной говорильни о вреде побочного эффекта  :)
Это же Хаскелл!  ;D

1939
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 04:34:10 pm »
Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное?
Если процедура не меняет ничего глобального (в том числе -- и ввод/вывод), то толку от неё нет, только процессорное время зря тратит. Зачем она нужна?

1940
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 06:30:53 am »
Согласен с Ильёй. OUT-параметры вполне органично могут применяться и безболезненно применяются. Неприязнь к ним - просто особенность восприятия или привычка конкретных людей.
OUT-параметры -- лишняя и бессмысленная сущность. Если процедура возвращает какие-то результаты в OUT-параметрах, то пусть она будет оформлена как функция, возвращающая кортеж из нескольких значений.
Ведь всё равно же есть функции, которые возвращают результат. Так почему бы эти функции не могли бы вернуть кортеж из нескольких значений?

Кроме того, сама природа функций подразумевает в большинстве случаев возможность не возвратить корректный результат, так что математическая нотация в случае корректной работы с подпрограммами не может использоваться часто.
такие функции должны возвращать результат типа Есть_корректный_результат/Нет_корректного_результата или Есть_корректный_результат/Код_ошибки_такой-то.

То, что OUT-параметры считаются органичными и всё такое -- просто следствие привычки к языкам со слабой системой типов или с неудобной работой с типами чуть сложнее целого числа...

1941
Общий раздел / Re:Археология -- предJava (Oak)
« : Февраль 22, 2011, 08:09:47 pm »
Если верить оберонщикам, то Яву сделали всего через год после того, как в Sun узнали про Оберон.
Что-то сомнительно, что медлительная крупная корпорация выпустит новый язык всего за год. Сколько они потом времени на доработки языка тратили -- дженерики те же самые вводили...

1942
Общий раздел / Re:Парадокс Блаба.
« : Февраль 22, 2011, 10:43:55 am »
Однако иногда жалею, что в том же C# нет даже простых сишных макросов -- иногда они позволили бы не делать тупой копи-паст.
Ну так и приведите пример. Мне, например, не приходилось жалеть.
И, кстати, где эти примеры на Лиспе с уменьшением размера кода в 20 раз?
Ну вот мой пример:if (obj1[i].abracadabra1 != obj2[i].other_abracadabra1)
{
    какие-то действия с obj1[i].abracadabra1:
   
    obj1[i].abracadabra1 = obj2[i].other_abracadabra1;

    какие-то другие действия с obj1[i].abracadabra1:
}

if (obj1[i].abracadabra2 != obj2[i].other_abracadabra2)
{
    какие-то действия с obj1[i].abracadabra2:
   
    obj1[i].abracadabra2 = obj2[i].other_abracadabra2;

    какие-то другие действия с obj1[i].abracadabra2:
}

if (obj1[i].abracadabra3 != obj2[i].other_abracadabra3)
{
    какие-то действия с obj1[i].abracadabra3:
   
    obj1[i].abracadabra3 = obj2[i].other_abracadabra3;

    какие-то другие действия с obj1[i].abracadabra3:
}

if (obj1[i].abracadabra4 != obj2[i].other_abracadabra4)
{
    какие-то действия с obj1[i].abracadabra4:
   
    obj1[i].abracadabra4 = obj2[i].other_abracadabra4;

    какие-то другие действия с obj1[i].abracadabra4:
}

if (obj1[i].abracadabra5 != obj2[i].other_abracadabra5)
{
    какие-то действия с obj1[i].abracadabra5:
   
    obj1[i].abracadabra5 = obj2[i].other_abracadabra5;

    какие-то другие действия с obj1[i].abracadabra5:
}
Типы у этих abracadabra1..abracadabra5 -- разные, не совместимые (в смысле нет там наследований всяких).

Были бы макросы (хоть сишные), можно было бы сделать так:
#define do_what_we_need(obj1,obj2)          \\
    if (obj1 != obj2)                       \\
    {                                       \\
        какие-то действия с obj1:           \\
                                            \\
        obj1 = obj2;                        \\
                                            \\
        какие-то другие действия с obj1;    \\
    }

do_what_we_need(obj1[i].abracadabra1, obj2[i].other_abracadabra1);
do_what_we_need(obj1[i].abracadabra2, obj2[i].other_abracadabra2);
do_what_we_need(obj1[i].abracadabra3, obj2[i].other_abracadabra3);
do_what_we_need(obj1[i].abracadabra4, obj2[i].other_abracadabra4);
do_what_we_need(obj1[i].abracadabra5, obj2[i].other_abracadabra5);

А по поводу 20-кратного уменьшения кода, да ещё и на Лиспе -- это Вы лучше у Пола Грэма спросите, у него наверняка есть таких примеров...

1943
Общий раздел / Re:Парадокс Блаба.
« : Февраль 22, 2011, 06:07:22 am »
Вообще, Пол Грэм (автор этой статьи) рекомендовал использовать макросы только в том случае, если они сокращают код раз в двадцать. Он признавал, что обильное и неуместное использование макросов способно только запутать и усложнить понимание программы.
Да даже если код благодаря макросам может быть уменьшен всего лишь в 10 раз -- разве это не повод для их использования.
К сожалению, не могу придумать такого примера, где было бы уменьшение кода на порядок. Однако иногда жалею, что в том же C# нет даже простых сишных макросов -- иногда они позволили бы не делать тупой копи-паст.

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

1944
Общий раздел / Re:Парадокс Блаба.
« : Февраль 22, 2011, 05:58:27 am »
А Грейхем про него вообще что-то знает? :-)
Почему-то у меня отложилось в памяти, что он считает недостатком требование, чтобы в списке все элементы были одного типа. Но сейчас не смог этого найти.
Может я все переврал и возвел напраслину?...  ???
То, что в списке все элементы одного типа -- скорее достоинство, чем недостаток -- проверка типов во время компиляции чаще полезна, чем неудобна.

Единственно, что для того, что бы поместить в гомогенный список значения разных типов, придётся объявлять дополнительный алгебраический тип данных, объединяющий в себе эти типы. Получается некоторый синтаксический оверхед, который, с другой стороны, можно объявить повышающим наглядность программы, а стало быть, дополнительно повышающий её правильность.

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

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

1945
Общий раздел / Re:Парадокс Блаба.
« : Февраль 22, 2011, 05:48:11 am »
Но Хаскелл -- ленивый язык, в нём такие фокусы проходят.
А кстати, как тут помогает ленивость? Я не вижу проблем сделать то же самое на энергичном языке с замыканиями.
Да, я наверное неточно выразился. Хотел поправиться, что дело в функциональности языка, но потом вспомнил, что в том же смоллтоке будет выглядеть примерно так же, как и в хаскелле.
Тем не менее, иногда удобнее не функцию передавать, а просто некое вычисление/действие, а ленивость языка позволяет отложить выполнение этого вычисления до тех пор, пока оно не понадобится. Но тут, скорее, чисто синтаксическое удобство.

1946
Общий раздел / Re:Парадокс Блаба.
« : Февраль 21, 2011, 12:51:48 pm »
Во-вторых, можете привести пример гениального использования макросов? Типа, а вот здесь языки без макросов сосут.
В C# есть оператор using, который, в частности, позволяет автоматически закрывать файл после того, как с ним будет проведена какая-то работа:// точно на память работу с файлами в .NET не помню,
// просто пример как это может выглядеть

using (File file = File.Open("filename.txt"))
{
    // что-то делаем с файлом file

} // тут он автоматически закрывается
Когда в С# не было этого оператора (вроде когда-то его не было, может ошибаюсь), приходилось (да и теперь в том же С или Обероне приходится) закрывать файл вручную. Естественно, можно было по запарке забыть это дело сделать.

Макросы позволяют самостоятельно модифицировать язык, добавить этот самый "using":; условный синтаксис:

(defmacro with-open-file (file filename body)
    (let (,file (open-file filename)
      ,@body
      (close-file ,file))))

; пример использования:

(with-open-file file "filename.txt"
    ( ; что-то делаем с файлом file
    )) ; тут он автоматически закрывается
Ну, в некоторых языках некоторые возможности макросов можно реализовать и без макросов. Например, в Хаскелле:with_open_file :: FilePath -> IOMode -> (Handle -> IO a) -> IO a
with_open_file filename mode action = do
    fhnd   <- openFile filename mode
    result <- action fhnd
    hClose fhnd
    return result

-- Пример использования

do  ...
    with_open_file "filename.txt" ReadMode $ \\file -> do
        ... -- что-то делаем с файлом file
    -- тут он автоматически закрывается
Но Хаскелл -- ленивый язык, в нём такие фокусы проходят.
В сях тоже можно соорудить макрос, но именно -- какой-никакой, а макрос.
А в оберонах?

1947
Общий раздел / Re:Парадокс Блаба.
« : Февраль 21, 2011, 05:23:34 am »
Здесь уже обсуждали http://forum.oberoncore.ru/viewtopic.php?f=61&t=1914&hilit=%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81
Отрицательное отношение к макросам я с тех пор не изменил.
Скажите, в чём принципиальное отличие макросов от подпрограмм, кроме того, что макросы работают во время компиляции, а подпрограммы -- во время выполнения программы?

1948
Общий раздел / Re:О дизайне. Форума и не только
« : Февраль 21, 2011, 05:21:20 am »
Код: (haskell) [Выделить]
module Main where

type GS = (Integer, Integer)

instance Num GS where
    (a, b) * (c, d) = (a*(c+d) + b*c, a*c + b*d)

fib n = fst $ ((1, 0)::GS) ^ n

main = do
    putStrLn $ take 10 $ show $ fib 1000000

1949
А чем, собственно, зацикливание отличается от просто очень долгого алгоритма? С точки зрения конечного результата в виде "зависания".
Ну, очень долгий алгоритм в конце концов всё же завершится с каким-то результатом, а зацикливание типа "10 GOTO 10" не завершится никогда.
При определённом подходе к программированию (например тотальное ФП) можно получить гарантию того, что алгоритм рано или поздно завершится, а иначе программа просто не скомпилируется из-за ошибки типизации.

1950
Общий раздел / Re:Оберон в образовании.
« : Февраль 17, 2011, 12:01:28 pm »
Думаю, не стоит пытаться обучить программированию любого (каждого) ученика. Ведь далеко не все ученики становятся физиками, химиками, так же далеко не все станут и программистами.
Соотвественно, нет смысла и чрезмерно упрощать преподавание программированию. Действительно интересующийся ученик сам и Паскаль, и Лисп изучит...

Страницы: 1 ... 128 129 [130] 131