вторник, 5 октября 2010 г.

В копилку лисповоду

Библиотека filtered functions позволяет реализовать что-то похожее на паттерн-матчинг при вызове обобщённой функции. В лиспе уже есть дженерики, но в них делается сравнение с полным объектом-образцом, а паттерн-матчинг делает сопоставление с неполным образцом, одновременно биндя переменные. Фильтрованные функции пошли ещё дальше: там выбор специализированного метода делается по вызову фильтра-предиката.

cl-unification делает паттерн-матчинг в его классическом виде и даже больше (больше, потому что паттернг-матчинг - это всего лишь часть унификации).

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

13 комментариев:

  1. cl-unification вызывала у меня в своё время столько матов (я хотел использовать её в cl-routes), что решил написать унификацию сам.

    ОтветитьУдалить
  2. Она делал что-то не то и как-то не так ))

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

    ОтветитьУдалить
  4. Самое красивое в filtered functions то, что позволяет удобно описать в методах основной алгоритм, а особые случае, ну там conditions всякие, например, дописать ниже.
    Но к сожалению, полностью реализовано пока только на SBCL.

    ОтветитьУдалить
  5. > Она делал что-то не то и как-то не так ))
    Да, это кошмар какой-то (:
    Почему я не могу (unify #T(string &rest ?s) "qwerty"), например?
    Почему обязательно надо как минимум (unify #T(string ?s &rest ?ss) "qwerty")?

    ОтветитьУдалить
  6. > (unify #T(string &rest ?s) "qwerty")

    А какой в этом смысл?

    ОтветитьУдалить
  7. Ну получается строку целиком матчить можно только через type-template.
    Второй вариант, например, приматчит к ?s первый символ, к ?ss - остальные.
    Получается, это фича, чтобы не использовали специализированные шаблоны, где нужен типовый?

    ander-skirnir

    ОтветитьУдалить
  8. (unify #T(string &rest ?s) "qwerty") - это аналог ML'евого [|s] = "qwerty". Я думаю, что ML-образные будут против.

    ОтветитьУдалить
  9. Ну тогда ясно. Мне чего-то интуитивнее если и так, и сяк можно было.

    ОтветитьУдалить
  10. Мне еще cl-match понравился. Есть подозрение, что он может и быстрее быть. Вернусь с пар - проверю :)

    ОтветитьУдалить
  11. Ага, так и знал, что с этим unification что-то не так! Если кому интересно, бенчмакр (: http://ander-skirnir.blogspot.com/2010/10/cl-unification-vs-cl-match.html

    ОтветитьУдалить
  12. Имхо, сравнение не совсем корректно... Пошёл комментить :)

    ОтветитьУдалить