История изменений
Исправление den73, (текущая версия) :
Как ты предлагаешь обращаться к типу-сумме без сопоставления?
Здесь я определил тип Апельсин-или-яблоко-с-меткой. Пусть у нас переменная Ая имеет такой тип и компилятор про это знает. Вот как это выглядит в реальном лиспа (сокращая до Аиясм).
;; эти две функции и сеттеры для них можно нагенеририровать автоматически
;; и их не будет видно в исходном коде, будет только
;; (Определить-меченное-объединение Аиясм Апельсин Яблоко)
(defun Аиясм-Яблоко (Сие)
(assert (eq (Аиясм-Метка Сие) 'Яблоко))
(the Яблоко (Аиясм-Значение Сие)))
(defun Аиясм-Апельсин (Сие)
(assert (eq (Аиясм-Метка Сие) 'Апельсин))
(the Апельсин (Аиясм-Значение Сие)))
;; А это собственно пример разбора
(defun Превратить-в-число (Ая)
(declare (type Аиясм Ая)
(ecase (Аиясм-Метка Ая)
(Яблоко
(Вес (Аиясм-Яблоко Ая)))
(Апельсин
(Цена (Аиясм-Апельсин Ая))))
Здесь проверка идёт в рантайме и ecase - плохая конструкция, т.к. она не понимает, что речь идёт именно о тегах типа Аиясм, но это можно поменять, сделав специфическую конструкцию, она будет вполне органично смотреться. Избавиться от проверок в рантайме нельзя (т.е. я не знаю как), и тут как раз и есть профит Хаскеля - давай не будем тратить время на этот аспект.
Если перейти к лирике, я пробовал несколько либ паттерн-матчинга для лиспа. Но как-то ни одна не прижилась у меня. Отсюда вывод: для лиспа паттерн-матчинг - лишь инструмент, без него вполне можно обойтись.
Тебе ответная задача: напиши сравнение двух Аиясм на Хаскеле с ПМ, чтобы выдавалась какая-то инфа о месте, где они не совпадают.
Исправление den73, :
Как ты предлагаешь обращаться к типу-сумме без сопоставления?
Здесь я определил тип Апельсин-или-яблоко-с-меткой. Пусть у нас переменная Ая имеет такой тип и компилятор про это знает. Вот как это выглядит в реальном лиспа (сокращая до Аиясм).
;; эти функции и сеттеры для них можно нагенеририровать автоматически
;; и их не будет видно в исходном коде, будет только
;; (Определить-меченное-объединение Аиясм Апельсин Яблоко)
(defun Аиясм-Яблоко (Сие)
(assert (eq (Аиясм-Метка Сие) 'Яблоко))
(the Яблоко (Аиясм-Значение Сие)))
(defun Аиясм-Апельсин (Сие)
(assert (eq (Аиясм-Метка Сие) 'Апельсин))
(the Апельсин (Аиясм-Значение Сие)))
(defun Превратить-в-число (Ая)
(declare (type Аиясм Ая)
(ecase (Аиясм-Метка Ая)
(Яблоко
(Вес (Аиясм-Яблоко Ая)))
(Апельсин
(Цена (Аиясм-Апельсин Ая))))
Здесь проверка идёт в рантайме и ecase - плохая конструкция, т.к. она не понимает, что речь идёт именно о тегах типа Аиясм, но это можно поменять, сделав специфическую конструкцию, она будет вполне органично смотреться. Избавиться от проверок в рантайме нельзя (т.е. я не знаю как), и тут как раз и есть профит Хаскеля - давай не будем тратить время на этот аспект.
Если перейти к лирике, я пробовал несколько либ паттерн-матчинга для лиспа. Но как-то ни одна не прижилась у меня. Отсюда вывод: для лиспа паттерн-матчинг - лишь инструмент, без него вполне можно обойтись.
Тебе ответная задача: напиши сравнение двух Аиясм на Хаскеле с ПМ, чтобы выдавалась какая-то инфа о месте, где они не совпадают.
Исправление den73, :
Как ты предлагаешь обращаться к типу-сумме без сопоставления?
Здесь я определил тип Апельсин-или-яблоко-с-меткой. Пусть у нас переменная Ая имеет такой тип и компилятор про это знает. Вот как это выглядит в реальном лиспа (сокращая до Аиясм).
;; эти функции и сеттеры для них можно нагенеририровать автоматически
;; и их не будет видно в исходном коде, будет только
;; (Определить-меченное-объединение Аиясм Апельсин Яблоко)
(defun Аиясм-Яблоко (Сие)
(assert (eq (Аиясм-Метка Сие) 'Яблоко))
(the Яблоко (Аиясм-Значение Сие)))
(defun Аиясм-Апельсин (Сие)
(assert (eq (Аиясм-Метка Сие) 'Апельсин))
(the Апельсин (Аиясм-Значение Сие)))
(defun Превратить-в-число (Ая)
(declare (type Аиясм Ая)
(ecase (Аиясм-Метка Ая)
(Яблоко
(Вес (Аиясм-Яблоко Ая)))
(Апельсин
(Цена (Аиясм-Апельсин Ая))))
Здесь проверка идёт в рантайме и ecase - плохая конструкция, т.к. она не понимает, что речь идёт именно о тегах типа Аиясм, но это можно поменять, сделав специфическую конструкцию, она будет вполне органично смотреться. Избавиться от проверок в рантайме нельзя (т.е. я не знаю как), и тут как раз и есть профит Хаскеля - давай не будем тратить время на этот аспект.
Если перейти к лирике, я пробовал несколько либ паттерн-матчинга для лиспа. Но как-то ни одна не прижилась у меня. Отсюда вывод: для лиспа паттерн-матчинг - лишь инструмент, без него вполне можно обойтись.
Тебе ответная задача: напиши сравнение двух Аиясм на Хаскеле с ПМ, чтобы выдавалась какая-то инфа о месте, где они не совпадают.
Исходная версия den73, :
Как ты предлагаешь обращаться к типу-сумме без сопоставления?
Здесь я определил тип Апельсин-или-яблоко-с-меткой. Пусть у нас переменная Ая имеет такой тип и компилятор про это знает. Вот как это выглядит в реальном лиспа (сокращая до Аиясм).
;; эти функции и сеттеры для них можно нагенеририровать автоматически
;; и их не будет видно в исходном коде, будет только
;; (Определить-меченное-объединение Аиясм Апельсин Яблоко)
(defun Аиясм-Яблоко (Сие)
(assert (eq (Аиясм-Метка Сие) 'Яблоко))
(Аиясм-Значение Сие))
(defun Аиясм-Апельсин (Сие)
(assert (eq (Аиясм-Метка Сие) 'Апельсин))
(Аиясм-Значение Сие))
(defun Превратить-в-число (Ая)
(declare (type Аиясм Ая)
(ecase (Аиясм-Метка Ая)
(Яблоко
(Вес (Аиясм-Яблоко Ая)))
(Апельсин
(Цена (Аиясм-Апельсин Ая))))
Здесь проверка идёт в рантайме и ecase - плохая конструкция, т.к. она не понимает, что речь идёт именно о тегах типа Аиясм, но это можно поменять, сделав специфическую конструкцию, она будет вполне органично смотреться. Избавиться от проверок в рантайме нельзя (т.е. я не знаю как), и тут как раз и есть профит Хаскеля - давай не будем тратить время на этот аспект.
Если перейти к лирике, я пробовал несколько либ паттерн-матчинга для лиспа. Но как-то ни одна не прижилась у меня. Отсюда вывод: для лиспа паттерн-матчинг - лишь инструмент, без него вполне можно обойтись.
Тебе ответная задача: напиши сравнение двух Аиясм на Хаскеле с ПМ, чтобы выдавалась какая-то инфа о месте, где они не совпадают.