> По-моему единственная проблема git — это сложность.
Git простой и предельно логичный в своей архитектуре. Сложности и магия возникли тогда, когда попытались сделать «как в свн», тут-то абстракции потекли.
> Встроенные типы даних реализованы не на Пайтоне, поэтому нет возможности динамически добавлять атрибуты.
Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
Исходя из моего опыта, гит лучше понимается и воспринимается, если изучать его снизу вверх: начиная с комманд git cat-file, git update-ref, git write-tree, git reflog, git rev-parse и т.д. Даже есть вот такой туториал на аглицком: ftp.newartisans.com/pub/git.from.bottom.up.pdf.
dajaxproject.com — писать на питоне, чтобы не писать на js? Я до сих пор не могу простить авторам джанги forms и widget, которые вообще никак не вписываются ни в mvt, ни в mvc — чтобы поменять css класс — надо лезть в forms.py, потом искать виджет, а если не повезет, то еще и в темплейт виджета.
Нельзя поменять значение глобальной переменной только для данного конкретного execution context — в лиспе dynamic scope (к сожалению, не знаю, как это переводится все на русский язык).
> thread local переменные и синглтоны к вашим услугам. И, опять же, это не полный аналог — но полностью подходящий для решения большинства практических задач.
> Я придерживаюсь позиции что автор чуток преувеличил и на практике роль синтаксиса конкретного языка не так важна.
Совершенно верно, синтаксис не так важен. У лиспа (CL, scheme, clojure) как раз множество интересных свойств в самой семантике.
> Но для языков общего назначения и практических задач, решаемых программистами, разница между лиспом и тем же C на мой взгляд не такая огромная, как старается показать автор.
На самом деле автор не очень любит CL :) И как рза разница есть и действительно очень большая, это совсем разные языки. Начиная с типизации, сборщика мусора, синтаксиса, ООП и прочим.
> ИМХО, преувеличение, вызванное недостаточным знанием других языков программирования. Конечно, встроенный в язык AST, списки и сборщик мусора это хорошо — но это не какое-то фатальное преимущество.
Помимо макросов, в CL, например, есть еще система рестартов, которая мощнее просто исключений, CLOS с мультиметодами, множественным наследованием, богатой системой классов; метаобъектный протокол (MOP), возможность возвращать несколько значений функцией, динамические переменные, символы и прочее.
> LISP
Так назывался первый лисп в 50ых годах.
> Могу предположить, что автор статьи, как и многие другие, рассматривает программирование исключительно в разрезе решения академических задач — технически простые программы, которые занимаются математическими рассчетами. Область, конечно, хорошая — но, ИМХО, очень нишевая.
Автор — Марк Тарвер — да, потому что он ученый. Но лисп (CL) — это все-таки промышленный язык, на которым в конце концов была написана операционная система и уйма софта к ней — всякие кады, редакторы и т. д.
а, ну отлично.
> rebase не пользуюсь, не знаю, может и нет
Это такая интерактивная переписывалка истории.
Git простой и предельно логичный в своей архитектуре. Сложности и магия возникли тогда, когда попытались сделать «как в свн», тут-то абстракции потекли.
… __slots__ = []
…
>>> a = A()
>>> a.x = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'A' object has no attribute 'x'
>>> hasattr(A(), '__dict__')
False
>>>
Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
Основное про классы и модель данных, тут:
docs.python.org/reference/datamodel.html#
>>> x = object()
>>> x.foo = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'object' object has no attribute 'foo'
>>> class Object(object): pass
…
>>> y = Object()
>>> y.foo = 1
>>> y.foo
1
>>>
почему так, ведь мы только наследовали класс, но при этом, ничего не добавляли и меняли. Ну и почему в x=object() нельзя добавлять новые атрибуты.
Я полагаю будет эксепшн, поскольку атрибуты метакласса доступны только классу, но не инстансу класса :)
Этот тест скорее на понимание того, что Bar является объектом Foo и поэтому в Bar доступны все классовые переменные из Foo, а не только property.
1) getattr и тогда вызывается метод __get__,
2) установки атрибут (setattr)
3) и удаления атрбиута(delattr)
class Descriptor(object):
def __get__(*args, **kw):
…
def __set__(*args, **kw):
…
class Foo(object):
x = Descriptor()
y = 1
foo = Foo()
Что будет происходить при вызове foo.x определяется в __get__ методе дескриптора, ну и так далее.
>>> import types
>>> a.add_x = types.MethodType(add_x, a)
> thread local
не то.
> синглтон
Легко злоупотребить синглтонами, и вообще, singletons considered harmful (с).
Нельзя поменять значение глобальной переменной только для данного конкретного execution context — в лиспе dynamic scope (к сожалению, не знаю, как это переводится все на русский язык).
> thread local переменные и синглтоны к вашим услугам. И, опять же, это не полный аналог — но полностью подходящий для решения большинства практических задач.
Совершенно верно, синтаксис не так важен. У лиспа (CL, scheme, clojure) как раз множество интересных свойств в самой семантике.
> Но для языков общего назначения и практических задач, решаемых программистами, разница между лиспом и тем же C на мой взгляд не такая огромная, как старается показать автор.
На самом деле автор не очень любит CL :) И как рза разница есть и действительно очень большая, это совсем разные языки. Начиная с типизации, сборщика мусора, синтаксиса, ООП и прочим.
Помимо макросов, в CL, например, есть еще система рестартов, которая мощнее просто исключений, CLOS с мультиметодами, множественным наследованием, богатой системой классов; метаобъектный протокол (MOP), возможность возвращать несколько значений функцией, динамические переменные, символы и прочее.
> LISP
Так назывался первый лисп в 50ых годах.
> Могу предположить, что автор статьи, как и многие другие, рассматривает программирование исключительно в разрезе решения академических задач — технически простые программы, которые занимаются математическими рассчетами. Область, конечно, хорошая — но, ИМХО, очень нишевая.
Автор — Марк Тарвер — да, потому что он ученый. Но лисп (CL) — это все-таки промышленный язык, на которым в конце концов была написана операционная система и уйма софта к ней — всякие кады, редакторы и т. д.