JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 46 47 [48] 49 50 ... 65 66 ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#706
,
|
|
|
|
Формально да. (Астарот сказал, у меня лучше не получится)
Но фактически мы туда можем запихать кучу всяких ПАРАМЕТРОВ и работать с ними, а не с отдельными аргументами... Добавлено Цитата D_KEY @ А еще можно третьим аргументом добавить приведение к float, а четвертым ввести округление полученного float до определенного количества знаков...Функция возведения в квадрат может иметь смысл для какого-то сложного объекта(например, у нас есть объект-пара, рассматриваемые как числитель и знаменатель рационального числа), но она не имеет смысла для, например, трех аргументов - аргумент у функции один. А можно вместо этого передать один объект с именованными настройками данной операции... |
|
Сообщ.
#707
,
|
|
|
|
Цитата fatalist @ Но фактически мы туда можем запихать кучу всяких ПАРАМЕТРОВ и работать с ними Что это меняет? Я в каком-нибиудь С "фактически" могу затереть кусок памяти произвольного объекта, но это не говорит о том, что типы и объекты не имеют смысла в С. |
|
Сообщ.
#708
,
|
|
|
|
Цитата D_KEY @ Не понял Что это меняет? Я в каком-нибиудь С "фактически" могу затереть кусок памяти произвольного объекта, но это не говорит о том, что типы и объекты не имеют смысла в С. |
|
Сообщ.
#709
,
|
|
|
|
Цитата fatalist @ Цитата D_KEY @ Не понял Что это меняет? Я в каком-нибиудь С "фактически" могу затереть кусок памяти произвольного объекта, но это не говорит о том, что типы и объекты не имеют смысла в С. ![]() То, что ты можешь обойти некий механизм, не означает, что механизм не нужен. |
|
Сообщ.
#710
,
|
|
|
|
Цитата D_KEY @ ну нужность я пока не ощутил... То, что ты можешь обойти некий механизм, не означает, что механизм не нужен. |
|
Сообщ.
#711
,
|
|
|
|
korvin, на самом деле List я тебе для иллюстрации привел, а так можно воспользоваться стандартными парами:
![]() ![]() make_pair(1, make_pair("two", make_pair(false, nil))); Добавлено Цитата fatalist @ Цитата D_KEY @ ну нужность я пока не ощутил...То, что ты можешь обойти некий механизм, не означает, что механизм не нужен. Ну мы уже определились, что для браузеров не критично. Потому, наверно, и не ощущаешь |
|
Сообщ.
#712
,
|
|
|
|
Цитата D_KEY @ Так никто в JS таким образом ничего и не обходит! Так делается из соображений удобства (если параметров например должно быть больше пяти, проще уже передать объект и именованными свойствами), а не для того ненужного механизма, которого к счастью нет То, что ты можешь обойти некий механизм, не означает, что механизм не нужен. Добавлено Цитата D_KEY @ Ну если я начну вдруг писать не для браузеров, и там будут реализованы эти механизмы, я тоже смирюсь и не буду видеть в этом ничего плохого...Ну мы уже определились, что для браузеров не критично. Потому, наверно, и не ощущаешь Однако хочу сказать, что когда я перестал баловаться с C++ и стал писать на JS, я почувствовал довольно сильное облегчение безо всех этих ограничений... |
|
Сообщ.
#713
,
|
|
|
|
Цитата D_KEY @ korvin, на самом деле List я тебе для иллюстрации привел, а так можно воспользоваться стандартными парами: ![]() ![]() make_pair(1, make_pair("two", make_pair(false, nil))); Можно. Теперь ограничь типы элементов этого паровоза, например классом Printable ![]() ![]() class Printable { void print(); } |
|
Сообщ.
#714
,
|
|
|
|
Цитата fatalist @ Однако хочу сказать, что когда я перестал баловаться с C++ и стал писать на JS, я почувствовал довольно сильное облегчение безо всех этих ограничений... Да причем тут этот самый С++? Никто с ним js не сравнивает. В других динамических языках ты не вызовешь функцию с неверным числом параметров. Даже в лиспе: ![]() ![]() >(defun f (x) (* x x)) F >(f 10) 100 >(f 1 1) Error: F [or a callee] requires less than two arguments. Я вот думаю, есть ли еще хоть один динамический язык с таким же поведением, как js?.. Добавлено Цитата korvin @ Теперь ограничь типы элементов этого паровоза, например классом Printable ![]() ![]() class Printable { void print(); } Это не имеет смысла, работать ты будешь с такими списками только через шаблоны и все итак будет работать для всех типов, у которых есть метод print(), и не будет работать, если метода print() нет. Могу сделать ошибку времени компиляции, если тип не наследует от Printable, но это лишние(ИМХО). |
|
Сообщ.
#715
,
|
|
|
|
Цитата D_KEY @ Да причем тут этот самый С++? Никто с ним js не сравнивает. В других динамических языках ты не вызовешь функцию с неверным числом параметров. Значит js удобнее других динамических языков |
|
Сообщ.
#716
,
|
|
|
|
Цитата D_KEY @ Это не имеет смысла, работать ты будешь с такими списками только через шаблоны и все итак будет работать для всех типов, у которых есть метод print(), и не будет работать, если метода print() нет. Могу сделать ошибку времени компиляции, если тип не наследует от Printable, но это лишние(ИМХО). Мне не нужна ошибка в месте использования, мне нужна ошибка в месте определения (точнее в месте вызова make_pair с типами, не поддерживающими Printable) =) |
|
Сообщ.
#717
,
|
|
|
|
Цитата korvin @ Мне не нужна ошибка в месте использования, мне нужна ошибка в месте определения (точнее в месте вызова make_pair с типами, не поддерживающими Printable) =) "Не поддерживающими" Printable - это как? Если наследование - то можно, но лишнее, на мой взгляд. Если тебе нужна проверка без лишних манипуляций(вроде твоих instance или наследования), то нужны концепты. Добавлено Собственно, мой вчерашний пример только через пары: ![]() ![]() struct Nil_t {} nil; void format_print(const char *s, Nil_t end = nil) { std::cout << s; } template<typename T, typename H> void format_print(const char* s, pair<T, H> lst) { while (s && *s) { if (*s=='%' && *(s+1) !='%') { std::cout << lst.first; return format_print(++s, lst.second); } std::cout << *s++; } } ![]() ![]() format_print("a = %, b = %, c = %\n", make_pair(1, make_pair("aaa", make_pair(false, nil)))); Добавлено Там правда бага с %%, но фиг с ним |
|
Сообщ.
#718
,
|
|
|
|
Тут скорее для скорости. Движку не надо париться над выяснением того. а есть ли параметры, сколько их, и т.д.
Тупо завернул, вызвал, а там сами разбирайтесь что к чему. |
|
Сообщ.
#719
,
|
|
|
|
Цитата D_KEY @ "Не поддерживающими" Printable - это как? Если наследование - то можно, но лишнее, на мой взгляд. Если тебе нужна проверка без лишних манипуляций(вроде твоих instance или наследования), то нужны концепты. Ну вот смотри Например пишу я библиотечный модуль ![]() ![]() module GList ( GList, GNil, Print(..), nil, (<+>), (<%>), list, test ) where import Control.Monad data GList a b = GCons a b | GNil type GNil = GList () () nil :: GNil nil = GNil class Print a where prn :: a -> IO () instance (Print a, Print b) => Print (GList a b) where prn GNil = return () prn (GCons x xs) = do prn x putStrLn "" prn xs instance Print Int where prn x = putStr $ show x instance Print Bool where prn x = putStr $ show x instance Print () where prn x = putStr $ show x infixr <+> (<+>) :: a -> GList b c -> GList a (GList b c) x <+> xs = GCons x xs infixr <%> (<%>) :: (Print a, Print b, Print c) => a -> GList b c -> GList a (GList b c) (<%>) = (<+>) x :: Integer x = 1 list = x <+> False <+> nil test :: (Print a, Print b) => GList a b -> IO () test = prn и в определении list использовал обычную функцию (<+>), не ограничивающую тип классом Print. Никаких ошибок компиляции при этом, что вполне логично. Однако при попытке применить test к list у кого-то возникнет ошибка компиляции. Неприятно. Хорошо еще, что можно доопределить instance Print Integer в любом другом месте, а если было б нельзя? А используй я вместо (<+>) более строгую (<%>), мне бы выдало ошибку уже при компиляции моего модуля и я бы сам на месте решил, что мне делать с моим определением list |
|
Сообщ.
#720
,
|
|
|
|
korvin, не понял к чему это
Суть в том, что без переменного числа аргументов я смогу обойтись почти таким же способом, который ты показал на псевдокоде. Вот только ...-шаблонны из нового стандарта удобнее А относительно ограничений на параметры шаблона(нормальных, а не требование реализации интерфейса) - нужны концепты. Их (пока) в С++ нет. В бусте есть костыли на эту тему Добавлено korvin, вспомни вчерашний пример Игоря - стрелка Пирса(ну или штрих Шеффера) образует базис и через нее можно выразить любую другую булеву операцию. Но это не повод отказываться от систем с другими(и более громоздкими) базисами Особенно, если речь идет не о теории, а о практике - да, элементы или-не/и-не могут выразить любую логическую схему, но это не всегда удобно и выгодно Добавлено Кстати, в том шаблонном коде с ... и не будет функции с произвольным количеством параметров. Этот шаблон будет генерировать функцию с нужным числом и типами аргументов. |