LINUX.ORG.RU

История изменений

Исправление 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 - плохая конструкция, т.к. она не понимает, что речь идёт именно о тегах типа Аиясм, но это можно поменять, сделав специфическую конструкцию, она будет вполне органично смотреться. Избавиться от проверок в рантайме нельзя (т.е. я не знаю как), и тут как раз и есть профит Хаскеля - давай не будем тратить время на этот аспект. 

Если перейти к лирике, я пробовал несколько либ паттерн-матчинга для лиспа. Но как-то ни одна не прижилась у меня. Отсюда вывод: для лиспа паттерн-матчинг - лишь инструмент, без него вполне можно обойтись. 

Тебе ответная задача: напиши сравнение двух Аиясм на Хаскеле с ПМ, чтобы выдавалась какая-то инфа о месте, где они не совпадают.