V>>cons — это термин ячейки, которые образуют связанный список, состав этой ячеки — элементы car и cdr. Имхо, ты перепутал термины с названиями одноименных ф-ий.
V>>Одна ячейка cons — это и есть список. Ничто другое списком не является, кроме nil.
Z>Мне не жалко, я повторю: cons — это функция, название которой есть сокращение от constructor, которая является конструктором пары.
И?
Z>car и cdr — функции, а не "состав ячейки". Z>То, что вы называете "термин ячейки", называется "pair" или "dotted pair"
Замечание, связанный и dotted список — какая разница?
проверь сам на предикате (atom (cons 42 43)) и заодно посмотри в исходники любого лиспа, что именно проверяет этот предикат.
Z>А так: (cons nil (cons 42 43))?
Туда же.
Z>Не верите мне, наберите в гугле "cons definition", например.
Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.
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.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, reductor, Вы писали:
E>>>Не удивительно, что это говорит человек, которого даже от Ruby тошнит. А уж от чистого Smalltalk...
R>>?? R>>Можно попросить расшифровать мысль?
E>Ну просто разработчики Ruby не скрывают, что очень многое было взято из Smalltalk. Только язык попытались сделать прагматиченее.
Прагматичнее, да.
Мацумото во всеуслышание объявляет, что у него взорвался мозг, когда он пытался разобраться с хаскелем, после чего идет делать "прагматичный" язык.
Почему-то мне кажется, что хаскель он не смог освоить, потому что у него уже был разорванный мозг. Смоллтолком.
Я еще могу не слишком нервничать, когда вот это позиционируется как прагматичный смоллтолк.
В случае с руби — это прагматичная каша из остатков головы его создателя.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, reductor, Вы писали:
E>>>А знать хорошо C++ -- это может быть посложнее, чем знать 10-15 других языков.
R>>Прошу прощения, но откуда такие сведения? R>>Неужели по собственному опыту?
E>Да. И не только моему. Думаю, что многие из учасников форума C/C++ со мной согласятся.
Перечислять эти 15 языков, которые вы знаете, вы, конечно, откажетесь?
R>>Ну с удовольствием посмотрю здесь на разбор этой грамматике на yacc+С++. R>>Время можно будет прикинуть по количеству строчек там и там.
E>Просто разбор? А какой в этом смысл, в простом разборе-то?
чтобы сохранить получившийся AST в виде s-expressions.
Здравствуйте, 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++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, reductor, Вы писали:
E>>>Да. И не только моему. Думаю, что многие из учасников форума C/C++ со мной согласятся.
R>>Перечислять эти 15 языков, которые вы знаете, вы, конечно, откажетесь?
E>Нет. Но я не знаю 15 языков. E>На сегодняшний момент я пользуюсь двумя: С++ и Ruby. Знаю их на относительно среднем уровне.
Так на каком тогда основании делается предположение, что С++ сложнее 15 языков?
E>Зато ты, как я понимаю, знаешь больше 15-ти, но C++ толком не знаешь. Хотя, как мне кажется, С++ в этот список будет входить.
А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я?
Если уж вы так настойчиво хотите обсудить эту тему.
R>>чтобы сохранить получившийся AST в виде s-expressions.
E>Не, на уровне AST я пас. Никогда его не строил.
Потрясающее откровение.
Знаете что такое "знать язык" в моем понимании?
Это когда понимаешь как он работает — когда можешь написать компилятор или интерпретатор этого языка.
Здравствуйте, reductor, Вы писали:
E>>Не, на уровне AST я пас. Никогда его не строил.
R>Потрясающее откровение.
А я вообще редко обманываю.
R>Знаете что такое "знать язык" в моем понимании? R>Это когда понимаешь как он работает — когда можешь написать компилятор или интерпретатор этого языка.
А в моем понимании, когда на этом языке ты можешь написать эффективную и корректную реализацию поставленной перед тобой задачи. Без скрытых багов, обусловленных незнанием языка.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, vdimas, Вы писали:
V>Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.
Про "cons cell" верю, думаю, в 60-х годах прошлого века так и говорили, а CAR и CDR были буквально ассемблерными командами для доступа к частям регистра на IBM-704. Но даже тогда "cons" обозначало конструктор, который не мог быть ни головой списка ни термином ячейки
V>>Голова списка (cons) — это может быть середина другого списка V>>cons — это термин ячейки, которые образуют связанный список...
DEA>Пожалуйста. Никогда не претендовал на "истину в последней инстанции". Более того, за варианты рефакторинга, которые меня (хотя бы) заинтрересуют, сполна отвешу оценками — минусов обещаю не ставить . Но... только за варианты рефакторинга.
Да замечательно он о 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++.
Здравствуйте, reductor, Вы писали:
R>Так на каком тогда основании делается предположение, что С++ сложнее 15 языков?
На основании твоих высказываний в данном форуме.
E>>Зато ты, как я понимаю, знаешь больше 15-ти, но C++ толком не знаешь. Хотя, как мне кажется, С++ в этот список будет входить.
R>А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я? R>Если уж вы так настойчиво хотите обсудить эту тему.
Давай так, если считаешь, что знаешь C++, то ответь на вопрос, заданный мной в: Re[17]: Goto's are evil?
Здравствуйте, 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 Я не против Хаскеля, он мне очень понравился, это хорошее продолжение традиций Лиспа, но некоторые вещи, с виду совсем простые, иногда очень не просто понять.
V>>Да верю, просто поверь, что cons-ячейка — это устоявшийся термин. См. "cons cell" в гугле, так же как и ее составные части CAR и CDR.
Z>Про "cons cell" верю, думаю, в 60-х годах прошлого века так и говорили, а CAR и CDR были буквально ассемблерными командами для доступа к частям регистра на IBM-704. Но даже тогда "cons" обозначало конструктор, который не мог быть ни головой списка ни термином ячейки
Здравствуйте, 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 и Миранды.
Здравствуйте, eao197, Вы писали:
R>>А вы уверены, что вы знаете С++ достаточно, чтобы оценить насколько его знаю я? R>>Если уж вы так настойчиво хотите обсудить эту тему.
E>Давай так, если считаешь, что знаешь C++, то ответь на вопрос, заданный мной в: Re[17]: Goto's are evil?
Здравствуйте, 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 и Миранды.
Таких зверей не знаем Тоже функциональные и ленивые?
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>Таких зверей не знаем :) Тоже функциональные и ленивые?