Re[17]: Goto's are evil?
От: vdimas Россия  
Дата: 08.12.05 20:29
Оценка:
Здравствуйте, z00n, Вы писали:


V>>cons — это термин ячейки, которые образуют связанный список, состав этой ячеки — элементы car и cdr. Имхо, ты перепутал термины с названиями одноименных ф-ий.


V>>Одна ячейка cons — это и есть список. Ничто другое списком не является, кроме nil.


Z>Мне не жалко, я повторю: cons — это функция, название которой есть сокращение от constructor, которая является конструктором пары.


И?

Z>car и cdr — функции, а не "состав ячейки".

Z>То, что вы называете "термин ячейки", называется "pair" или "dotted pair"

В общем, я не великий поклонник Лиспа, но его знатоки используют эти названия ф-ий именно как термины http://www.google.com.ua/search?hl=ru&q=cons+%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B0&meta=

Z>Или давайте зайдем с другого конца, (cons 42 43) — по вашему это связанный список?


Замечание, связанный и dotted список — какая разница?
проверь сам на предикате (atom (cons 42 43)) и заодно посмотри в исходники любого лиспа, что именно проверяет этот предикат.

Z>А так: (cons nil (cons 42 43))?


Туда же.

Z>Не верите мне, наберите в гугле "cons definition", например.


Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.

http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_25.html

A cons cell is an object that consists of two slots, called the CAR slot and the CDR slot. Each slot can hold or refer to any Lisp object. We also say that "the CAR of this cons cell is" whatever object its CAR slot currently holds, and likewise for the CDR.


A note to C programmers: in Lisp, we do not distinguish between "holding" a value and "pointing to" the value, because pointers in Lisp are implicit.
A list is a series of cons cells, linked together so that the CDR slot of each cons cell holds either the next cons cell or the empty list. See section 5. Lists, for functions that work on lists. Because most cons cells are used as part of lists, the phrase list structure has come to refer to any structure made out of cons cells.


...

Because cons cells are so central to Lisp, we also have a word for "an object which is not a cons cell". These objects are called atoms.



http://www.mari.su/mmlab/home/lisp/LECTION8/lec8-99.html#L8.1
Re[29]: Goto's are evil?
От: reductor  
Дата: 08.12.05 21:26
Оценка: :)))
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, reductor, Вы писали:


E>>>Не удивительно, что это говорит человек, которого даже от Ruby тошнит. А уж от чистого Smalltalk...


R>>??

R>>Можно попросить расшифровать мысль?

E>Ну просто разработчики Ruby не скрывают, что очень многое было взято из Smalltalk. Только язык попытались сделать прагматиченее.


Прагматичнее, да.
Мацумото во всеуслышание объявляет, что у него взорвался мозг, когда он пытался разобраться с хаскелем, после чего идет делать "прагматичный" язык.

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

Я еще могу не слишком нервничать, когда вот это позиционируется как прагматичный смоллтолк.

В случае с руби — это прагматичная каша из остатков головы его создателя.
Re[30]: Goto's are evil?
От: reductor  
Дата: 08.12.05 21:40
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, reductor, Вы писали:


E>>>А знать хорошо C++ -- это может быть посложнее, чем знать 10-15 других языков.


R>>Прошу прощения, но откуда такие сведения?

R>>Неужели по собственному опыту?

E>Да. И не только моему. Думаю, что многие из учасников форума C/C++ со мной согласятся.


Перечислять эти 15 языков, которые вы знаете, вы, конечно, откажетесь?

R>>Ну с удовольствием посмотрю здесь на разбор этой грамматике на yacc+С++.

R>>Время можно будет прикинуть по количеству строчек там и там.

E>Просто разбор? А какой в этом смысл, в простом разборе-то?


чтобы сохранить получившийся AST в виде s-expressions.
Re[30]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.12.05 21:55
Оценка:
Здравствуйте, reductor, Вы писали:

R>В случае с руби — это прагматичная каша из остатков головы его создателя.


Кому как. Значит у меня в голове тоже самое, поскольку мне удобно.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[31]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.12.05 21:55
Оценка:
Здравствуйте, reductor, Вы писали:

E>>Да. И не только моему. Думаю, что многие из учасников форума C/C++ со мной согласятся.


R>Перечислять эти 15 языков, которые вы знаете, вы, конечно, откажетесь?


Нет. Но я не знаю 15 языков.
На сегодняшний момент я пользуюсь двумя: С++ и Ruby. Знаю их на относительно среднем уровне.

Зато ты, как я понимаю, знаешь больше 15-ти, но C++ толком не знаешь. Хотя, как мне кажется, С++ в этот список будет входить.

R>>>Ну с удовольствием посмотрю здесь на разбор этой грамматике на yacc+С++.

R>>>Время можно будет прикинуть по количеству строчек там и там.

E>>Просто разбор? А какой в этом смысл, в простом разборе-то?


R>чтобы сохранить получившийся AST в виде s-expressions.


Не, на уровне AST я пас. Никогда его не строил.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[32]: Goto's are evil?
От: reductor  
Дата: 08.12.05 22:37
Оценка: +1 -1
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, reductor, Вы писали:


E>>>Да. И не только моему. Думаю, что многие из учасников форума C/C++ со мной согласятся.


R>>Перечислять эти 15 языков, которые вы знаете, вы, конечно, откажетесь?


E>Нет. Но я не знаю 15 языков.

E>На сегодняшний момент я пользуюсь двумя: С++ и Ruby. Знаю их на относительно среднем уровне.

Так на каком тогда основании делается предположение, что С++ сложнее 15 языков?

E>Зато ты, как я понимаю, знаешь больше 15-ти, но C++ толком не знаешь. Хотя, как мне кажется, С++ в этот список будет входить.


А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я?
Если уж вы так настойчиво хотите обсудить эту тему.

R>>чтобы сохранить получившийся AST в виде s-expressions.


E>Не, на уровне AST я пас. Никогда его не строил.


Потрясающее откровение.
Знаете что такое "знать язык" в моем понимании?
Это когда понимаешь как он работает — когда можешь написать компилятор или интерпретатор этого языка.
Re[33]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 05:55
Оценка:
Здравствуйте, reductor, Вы писали:

E>>Не, на уровне AST я пас. Никогда его не строил.


R>Потрясающее откровение.


А я вообще редко обманываю.

R>Знаете что такое "знать язык" в моем понимании?

R>Это когда понимаешь как он работает — когда можешь написать компилятор или интерпретатор этого языка.

А в моем понимании, когда на этом языке ты можешь написать эффективную и корректную реализацию поставленной перед тобой задачи. Без скрытых багов, обусловленных незнанием языка.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[18]: Goto's are evil?
От: z00n  
Дата: 09.12.05 06:27
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.


Про "cons cell" верю, думаю, в 60-х годах прошлого века так и говорили, а CAR и CDR были буквально ассемблерными командами для доступа к частям регистра на IBM-704. Но даже тогда "cons" обозначало конструктор, который не мог быть ни головой списка ни термином ячейки

V>>Голова списка (cons) — это может быть середина другого списка

V>>cons — это термин ячейки, которые образуют связанный список...
Re[10]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 07:00
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

E>>Меня еще терзают смутные сомнения, что и код SRC (C++): конверсия UTF-8 &lt;--&gt; Unicode на итераторах
Автор: 0xDEADBEEF
Дата: 03.11.05
можно прорефакторить. Только там все еще хуже: в одном цикле и continue, и goto. Про такой код хочется сказать вот так же: Re: Прокоментируйте код
Автор: eao197
Дата: 30.11.05


DEA>Пожалуйста. Никогда не претендовал на "истину в последней инстанции". Более того, за варианты рефакторинга, которые меня (хотя бы) заинтрересуют, сполна отвешу оценками — минусов обещаю не ставить . Но... только за варианты рефакторинга.


Вот, одну функцию прорефакторил
Re: SRC (C++): конверсия UTF-8 &lt;--&gt; Unicode на итераторах
Автор: eao197
Дата: 09.12.05



DEA> А то звиздеть здесь многие горазды, а вот код писать... увы...


Чего я больше всего опасаюсь на RSDN, так это репутации звиздуна. Надеюсь, что я ее не заслужу.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[28]: офтоп - Брюс Эккель о Руби, эмишах и пр :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 08:23
Оценка:
Здравствуйте, z00n, Вы писали:

Z>http://onthethought.blogspot.com/2005/01/thinking-in-ruby-not.html


Да замечательно он о Ruby отзывается (насколько позволяют мне его понять мои познания в английском):

But hey, if Ruby pushes the right buttons for you, great. It's probably the tool that will make you most productive right now, and that's what you should use.

... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 08:23
Оценка:
Здравствуйте, reductor, Вы писали:

R>Так на каком тогда основании делается предположение, что С++ сложнее 15 языков?


На основании твоих высказываний в данном форуме.

E>>Зато ты, как я понимаю, знаешь больше 15-ти, но C++ толком не знаешь. Хотя, как мне кажется, С++ в этот список будет входить.


R>А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я?

R>Если уж вы так настойчиво хотите обсудить эту тему.

Давай так, если считаешь, что знаешь C++, то ответь на вопрос, заданный мной в: Re[17]: Goto's are evil?
Автор: eao197
Дата: 01.12.05


Свои знания C++ я оцениваю весьма скромно.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[30]: Goto's are evil?
От: R.K. Украина  
Дата: 09.12.05 08:42
Оценка: 1 (1) +1
Здравствуйте, reductor, Вы писали:

R>Прагматичнее, да.

R>Мацумото во всеуслышание объявляет, что у него взорвался мозг, когда он пытался разобраться с хаскелем, после чего идет делать "прагматичный" язык.

И с этим можно согласиться, после такого:
append = foldr ((.).(:)) id -- вот как это понять, кроме как разложить (.) на лямбды? (дважды;)
и, в особенности, такого:
cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)
cfold f z l = cfold' (\x t g -> f x (g t)) z l -- это ж надо столько рекурсивных лямбд наворотить!

R>Почему-то мне кажется, что хаскель он не смог освоить, потому что у него уже был разорванный мозг. Смоллтолком.

Може и так. А у меня, значит, Лиспом

PS Я не против Хаскеля, он мне очень понравился, это хорошее продолжение традиций Лиспа, но некоторые вещи, с виду совсем простые, иногда очень не просто понять.
You aren't expected to absorb this
Re[29]: Goto's are evil?
От: Cyberax Марс  
Дата: 09.12.05 09:30
Оценка:
reductor wrote:

> Это называется "на языке"?


Только для вас:
PluginDesc::PluginDesc(const wchar_t *_manifest_text, size_t _size)
{
    //Black magic goes here :)
    rule<wide_phrase_scanner_t> identifier_rule=lexeme_d[(alpha_p | L'_' 
| L'$') >> *(alnum_p | L'_' | L'$')];
    rule<wide_phrase_scanner_t> 
value_rule=lexeme_d[*(anychar_p-L'\n'-L'\r')];   
    rule<wide_phrase_scanner_t> record_rule=
        identifier_rule[assign_a(name)] >> L":" >> 
value_rule[assign_a(value)];
    rule<wide_phrase_scanner_t> 
manifest_rule=+(record_rule[insert_at_a(props_,cref(name),cref(value))]);

    //Parse manifest
    parse_info<const wchar_t*> info=::parse(_manifest_text, 
_manifest_text+_size,manifest_rule,space_p);
    if (!info.hit || !info.full)
        THROW_FLEX_EX(InvalidManifest);
}

Язык С++

Этот код разбирает файл с описанием плугина (набор строк вида "имя :
значение").

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[19]: Goto's are evil?
От: vdimas Россия  
Дата: 09.12.05 13:00
Оценка:
Здравствуйте, z00n, Вы писали:


V>>Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.


Z>Про "cons cell" верю, думаю, в 60-х годах прошлого века так и говорили, а CAR и CDR были буквально ассемблерными командами для доступа к частям регистра на IBM-704. Но даже тогда "cons" обозначало конструктор, который не мог быть ни головой списка ни термином ячейки


пятикапельничаешь
Re[31]: Goto's are evil?
От: reductor  
Дата: 09.12.05 13:17
Оценка: 1 (1)
Здравствуйте, R.K., Вы писали:

RK>Здравствуйте, reductor, Вы писали:


R>>Прагматичнее, да.

R>>Мацумото во всеуслышание объявляет, что у него взорвался мозг, когда он пытался разобраться с хаскелем, после чего идет делать "прагматичный" язык.

RK>И с этим можно согласиться, после такого: append = foldr ((.).(:)) id -- вот как это понять, кроме как разложить (.) на лямбды? (дважды;)и, в особенности, такого: cfold' f z [] = z


Я даже на секунду не задумался, а в чем проблема?
В хаскеле вообще нет неоднозначностей и быть не может — у него строгая семантика. 100% лямбда.
а понять (.).(:), если первое время не понимаешь, очень просто — переписать.
append = foldr (compose . cons) id
    where compose = (.)
          cons = (:)
-- что то же самое, что и
append = foldr (compose . cons) id
    where compose left right = left . right
          cons left right = left : right

Если че, то взятие оператор в скобки — смена его ассоциативности и сдвиг.
(.) a b = a . b

В общем случае это выражается комбинатором:
comb a b = b a
-- так что 
comb x y z
-- рирайтится в
y x z
[code]

Элементарно и без вариантов (в сомнительных случаях см. спецификацию хаскеля).

RK>cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)
RK>cfold f z l = cfold' (\x t g -> f x (g t)) z l -- это ж надо столько рекурсивных лямбд наворотить!


_Вся_ программа на хаскеле после desugarer'a превращается в чистую лямбду. Нужно только выучить правила трансляции.
Ничего сложного здесь нет.

R>>Почему-то мне кажется, что хаскель он не смог освоить, потому что у него уже был разорванный мозг. Смоллтолком.

RK>Може и так. А у меня, значит, Лиспом :)

Не знаю, я и лисп и хаскель люблю. Хаскель, правда, если честно, больше ;)
Я на нем могу программировать в уме — не ошибаясь :)

RK>PS Я не против Хаскеля, он мне очень понравился, это хорошее продолжение традиций Лиспа, но некоторые вещи, с виду совсем простые, иногда очень не просто понять.


Нет, хаскель — не продолжение лиспа. Это важно понять. Это продолжение ISWIM и Миранды.
Re[34]: Goto's are evil?
От: reductor  
Дата: 09.12.05 15:41
Оценка:
Здравствуйте, eao197, Вы писали:

R>>А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я?

R>>Если уж вы так настойчиво хотите обсудить эту тему.

E>Давай так, если считаешь, что знаешь C++, то ответь на вопрос, заданный мной в: Re[17]: Goto's are evil?
Автор: eao197
Дата: 01.12.05

E>Свои знания C++ я оцениваю весьма скромно.

А почему вы тогда спрашиваете? вы антисемит?
Re[32]: Goto's are evil?
От: R.K. Украина  
Дата: 09.12.05 16:24
Оценка:
Здравствуйте, reductor, Вы писали:

R>Здравствуйте, R.K., Вы писали:


RK>>Здравствуйте, reductor, Вы писали:


R>>>Прагматичнее, да.

R>>>Мацумото во всеуслышание объявляет, что у него взорвался мозг, когда он пытался разобраться с хаскелем, после чего идет делать "прагматичный" язык.

RK>>И с этим можно согласиться, после такого: append = foldr ((.).( id -- вот как это понять, кроме как разложить (.) на лямбды? (дваждыи, в особенности, такого: cfold' f z [] = z


R>Я даже на секунду не задумался, а в чем проблема?


Вот именно, что проблема состоит в сложности понимания не синтаксиса, а самого принципа действия таких конструкций. Причем все составляющие известны:
(.)f g = \x -> g(f x)
-- (:) = cons
foldr f z []     =  z
foldr f z (x:xs) =  f x (foldr f z xs)
Всё понятно, никаких проблем.
Но это не добавляет ясности До тех пор, пока не вставить недостающие параметры, скобки и не переписать в виде лямбд:
append l l' = (foldr ((.).(:)) id l) l'
append l l' = (foldr (\x -> (.)(x:)) id l) l'
-- все, приехали, дальше только foldr надо заменять на что-то другое

По-моему, последняя инкарнация выглядит чуть понятнее, чем начальная, но всё же... Какой у неё "физический" смысл? Как надо понимать её действие?

R>В хаскеле вообще нет неоднозначностей и быть не может — у него строгая семантика. 100% лямбда.


В этом не хочется сомневаться

[skip: это всё ясно]
R>Элементарно и без вариантов (в сомнительных случаях см. спецификацию хаскеля).

RK>>cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)

RK>>cfold f z l = cfold' (\x t g -> f x (g t)) z l -- это ж надо столько рекурсивных лямбд наворотить![/code]

R>_Вся_ программа на хаскеле после desugarer'a превращается в чистую лямбду. Нужно только выучить правила трансляции.

R>Ничего сложного здесь нет.

А как можно посмотреть результаты трансляции в лямбду? И есть ли в интерпретаторе Хаскеля что-то типа (trace 'func-name)? Очень бы помогло.

R>>>Почему-то мне кажется, что хаскель он не смог освоить, потому что у него уже был разорванный мозг. Смоллтолком.

RK>>Може и так. А у меня, значит, Лиспом

R>Не знаю, я и лисп и хаскель люблю. Хаскель, правда, если честно, больше

R>Я на нем могу программировать в уме — не ошибаясь

Программировать в уме и я могу без ошибок. Правда такого ЯП ещё не выдумали

RK>>PS Я не против Хаскеля, он мне очень понравился, это хорошее продолжение традиций Лиспа, но некоторые вещи, с виду совсем простые, иногда очень не просто понять.


R>Нет, хаскель — не продолжение лиспа. Это важно понять. Это продолжение ISWIM и Миранды.


Таких зверей не знаем Тоже функциональные и ленивые?
You aren't expected to absorb this
Re[33]: Goto's are evil?
От: reductor  
Дата: 09.12.05 17:35
Оценка: 12 (2)
Здравствуйте, R.K., Вы писали:


RK>По-моему, последняя инкарнация выглядит чуть понятнее, чем начальная, но всё же... Какой у неё "физический" смысл? Как надо понимать её действие?


Нужно понять, что любой байндинг, любая конструкция в хаскеле, которая имеет свой синтаксис — это на самом деле просто аналог макроса в лиспе.
Компилятор одним из первых запускает процесс десахаризации (desugaring)
И у всего есть строгие правила трансляции.

let f x = x * x in f 10 -- это транслируется в:
(\f -> f) (\x -> x * x) 10

-- то есть в общем случае
let x = y in z -- это
(\x -> z) y

let f = (+ 5) . (* 10) in f 10 - это:
let f = (.) (+ 5) (* 10) in f 10 -- а потом:
let (.) = \x -> y -> z -> x (y z) и потом:
(\f -> f) (\x -> \y -> \z -> x (y z)) (+ 5) (* 10) 10
-- дальше можете потренироваться сами, там еще пара редукций :)



RK>А как можно посмотреть результаты трансляции в лямбду? И есть ли в интерпретаторе Хаскеля что-то типа (trace 'func-name)? Очень бы помогло.


ghc -ddump-ds

Но вообще лучше всего почитать про лямбда-исчисление и комбинаторы и SKI-исчисление Карри — вещь дико простая и когда ее понимаешь, даже документацию читать не надо, интуитивно ясно что происходит.

RK>Программировать в уме и я могу без ошибок. Правда такого ЯП ещё не выдумали :))


Хаскель :)
Настолько простой и математически чистый, что не дает возможности увильнуть в сторону :)


R>>Нет, хаскель — не продолжение лиспа. Это важно понять. Это продолжение ISWIM и Миранды.


RK>Таких зверей не знаем :) Тоже функциональные и ленивые?


Да, конечно. Лямбда другой быть не может :)
http://en.wikipedia.org/wiki/ISWIM -- это в общем начало эпохи
http://en.wikipedia.org/wiki/Miranda_programming_language
Re[35]: Goto's are evil?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 17:57
Оценка:
Здравствуйте, reductor, Вы писали:

E>>Давай так, если считаешь, что знаешь C++, то ответь на вопрос, заданный мной в: Re[17]: Goto's are evil?
Автор: eao197
Дата: 01.12.05

E>>Свои знания C++ я оцениваю весьма скромно.

R>А почему вы тогда спрашиваете? вы антисемит?


Имхо, гораздо проще и быстрее было продемострировать знания, если таковые имелись.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Goto's are evil?
От: LelicDsp Россия  
Дата: 09.12.05 18:24
Оценка:
C>>For example, it is quite common to have conditionals THAT DO NOT NEST.
B>я так и не понял где тут место goto, можно пример написать?

Последовательность инициализации/отката при ошибке типа:

if(Init1())
  goto fail1;
if(Init2())
  goto fail2;
if(Init3())
  goto fail3;
...
if(InitN())
  goto failN;

return 0; // success

//Rollback
failN:
  RollBackN-1();
...
fail2:
  RollBack1();
fail1:
   return -1;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.