LINUX.ORG.RU

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

Исправление monk, (текущая версия) :

#!1

разбор шаблон =
  длина = длина-строки шаблон
  проход позиция результат в-скобках =
    если
      (позиция == длина)
        значения результат позиция
      (в-скобках && (шаблон[позиция] == #\} || шаблон[позиция] == #\,))
        если пустой? $ оставшиеся результат тогда
          значения диапазон(результат[0]) позиция
          иначе
          значения результат позиция
      (шаблон[позиция] == #\{)
        значения после-группы в-группе = прочитать-группу (позиция + 1)
        проход после-группы слить(результат в-группе) в-скобках
      (позиция < длина - 1 && шаблон[позиция] == #\\)
        проход
          позиция + 2
          слить результат
            список $ строка шаблон[позиция + 1]
          в-скобках
      иначе
        проход
          позиция + 1
          слить результат
            список $ строка шаблон[позиция]
          в-скобках

  прочитать-группу начало слова(пустой-список) =
    значения слово остаток = проход начало '("") истина
    если
      (остаток == длина)
        значения начало '("{")
      (шаблон[остаток] == #\})
        значения
          остаток + 1
          слова ++ слово
      (шаблон[остаток] == #\,)
        прочитать-группу
          остаток + 1           
          слова ++ слово           
      иначе
        значения начало '("{") 
        
  значения ответ _ = проход 0 '("") ложь
  ответ

слить список . ещё-списки =
  если пустой? ещё-списки тогда
    список
    иначе
    применить слить
      применить добавить
        отобразить
          функция (строка1)
            отобразить
              функция (строка2) $ строка1 ++ строка2
              первый ещё-списки
          список
      оставшиеся ещё-списки

диапазон слово =
  длина = длина-строки слово
  конец = длина - 2
  пусть цикл (позиция(1))
    если
      (позиция >= конец)
        список слово
      (слово[позиция] == #\. && слово[позиция + 1] == #\.)
        если длина == 4 тогда
          диапазон-символов
            литера->число слово[0]
            литера->число слово[3]
          иначе
          диапазон-чисел
            подстрока слово 0 позиция
            подстрока слово $ позиция + 2
      иначе
        цикл $ позиция + 1
        
диапазон-символов начало конец =
  элемент число =
    строка $ число->литера число
  диапазон-элементов элемент начало конец

диапазон-чисел начало конец =
  начальное-число = строка->число начало
  конечное-число = строка->число конец
  если точное-целое? начальное-число && точное-целое? конечное-число тогда
    диапазон-элементов число->строка начальное-число конечное-число
    иначе
    начало ++ ".." ++ конец

диапазон-элементов элемент начало конец =
  если
    (начало > конец)
      элемент начало : диапазон-элементов элемент (начало - 1) конец
    (начало < конец)
      элемент начало : диапазон-элементов элемент (начало + 1) конец
    иначе
      список $ элемент начало
> разбор "/path/to/{foo,ba{r..z}}.txt"
  
'("/path/to/foo.txt"
  "/path/to/bar.txt"
  "/path/to/bas.txt"
  "/path/to/bat.txt"
  "/path/to/bau.txt"
  "/path/to/bav.txt"
  "/path/to/baw.txt"
  "/path/to/bax.txt"
  "/path/to/bay.txt"
  "/path/to/baz.txt")

> разбор "/path/to/{foo,ba{r,z}}.txt"
  
'("/path/to/foo.txt" "/path/to/bar.txt" "/path/to/baz.txt")

> разбор "~/{.local/share,.config,.cache}/{foo,bar}-package"
  
'("~/.local/share/foo-package" "~/.local/share/bar-package" "~/.config/foo-package" "~/.config/bar-package" "~/.cache/foo-package" "~/.cache/bar-package")

> разбор "foo-{15..1}"
  
'("foo-15" "foo-14" "foo-13" "foo-12" "foo-11" "foo-10" "foo-9" "foo-8" "foo-7" "foo-6" "foo-5" "foo-4" "foo-3" "foo-2" "foo-1")

Исправление monk, :

#!1

разбор шаблон =
  длина = длина-строки шаблон
  проход позиция результат в-скобках =
    если
      (позиция == длина)
        значения результат позиция
      (в-скобках && (шаблон[позиция] == #\} || шаблон[позиция] == #\,))
        если пустой? $ оставшиеся результат тогда
          значения диапазон(результат[0]) позиция
          иначе
          значения результат позиция
      (шаблон[позиция] == #\{)
        значения в-группе после-группы = прочитать-группу (позиция + 1)
        проход после-группы слить(результат в-группе) в-скобках
      (позиция < длина - 1 && шаблон[позиция] == #\\)
        проход
          позиция + 2
          слить результат
            список $ строка шаблон[позиция + 1]
          в-скобках
      иначе
        проход
          позиция + 1
          слить результат
            список $ строка шаблон[позиция]
          в-скобках

  прочитать-группу начало слова(пустой-список) =
    значения слово остаток = проход начало '("") истина
    если
      (остаток == длина)
        значения '("{") $ начало
      (шаблон[остаток] == #\})
        значения 
          слова ++ слово
          остаток + 1
      (шаблон[остаток] == #\,)
        прочитать-группу
          остаток + 1           
          слова ++ слово           
      иначе
        значения '("{") $ начало
        
  значения ответ _ = проход 0 '("") ложь
  ответ

слить список . ещё-списки =
  если пустой? ещё-списки тогда
    список
    иначе
    применить слить
      применить добавить
        отобразить
          функция (строка1)
            отобразить
              функция (строка2) $ строка1 ++ строка2
              первый ещё-списки
          список
      оставшиеся ещё-списки

диапазон слово =
  длина = длина-строки слово
  конец = длина - 2
  пусть цикл (позиция(1))
    если
      (позиция >= конец)
        список слово
      (слово[позиция] == #\. && слово[позиция + 1] == #\.)
        если длина == 4 тогда
          диапазон-символов
            литера->число слово[0]
            литера->число слово[3]
          иначе
          диапазон-чисел
            подстрока слово 0 позиция
            подстрока слово $ позиция + 2
      иначе
        цикл $ позиция + 1
        
диапазон-символов начало конец =
  элемент число =
    строка $ число->литера число
  диапазон-элементов элемент начало конец

диапазон-чисел начало конец =
  начальное-число = строка->число начало
  конечное-число = строка->число конец
  если точное-целое? начальное-число && точное-целое? конечное-число тогда
    диапазон-элементов число->строка начальное-число конечное-число
    иначе
    начало ++ ".." ++ конец

диапазон-элементов элемент начало конец =
  если
    (начало > конец)
      элемент начало : диапазон-элементов элемент (начало - 1) конец
    (начало < конец)
      элемент начало : диапазон-элементов элемент (начало + 1) конец
    иначе
      список $ элемент начало
> разбор "/path/to/{foo,ba{r..z}}.txt"
  
'("/path/to/foo.txt"
  "/path/to/bar.txt"
  "/path/to/bas.txt"
  "/path/to/bat.txt"
  "/path/to/bau.txt"
  "/path/to/bav.txt"
  "/path/to/baw.txt"
  "/path/to/bax.txt"
  "/path/to/bay.txt"
  "/path/to/baz.txt")

> разбор "/path/to/{foo,ba{r,z}}.txt"
  
'("/path/to/foo.txt" "/path/to/bar.txt" "/path/to/baz.txt")

> разбор "~/{.local/share,.config,.cache}/{foo,bar}-package"
  
'("~/.local/share/foo-package" "~/.local/share/bar-package" "~/.config/foo-package" "~/.config/bar-package" "~/.cache/foo-package" "~/.cache/bar-package")

> разбор "foo-{15..1}"
  
'("foo-15" "foo-14" "foo-13" "foo-12" "foo-11" "foo-10" "foo-9" "foo-8" "foo-7" "foo-6" "foo-5" "foo-4" "foo-3" "foo-2" "foo-1")

Исправление monk, :

#!1

разбор шаблон =
  длина = длина-строки шаблон
  проход позиция результат в-скобках =
    если
      (позиция == длина)
        значения результат позиция
      (в-скобках && (шаблон[позиция] == #\} || шаблон[позиция] == #\,))
        если пустой? $ оставшиеся результат тогда
          значения диапазон(результат[0]) позиция
          иначе
          значения результат позиция
      (шаблон[позиция] == #\{)
        значения в-группе после-группы = прочитать-группу (позиция + 1)
        проход после-группы слить(результат в-группе) в-скобках
      (позиция < длина - 1 && шаблон[позиция] == #\\)
        проход
          позиция + 2
          слить результат
            список $ строка шаблон[позиция + 1]
          в-скобках
      иначе
        проход
          позиция + 1
          слить результат
            список $ строка шаблон[позиция]
          в-скобках

  прочитать-группу начало слова(пустой-список) запятая(ложь) =
    значения слово остаток = проход начало '("") истина
    если
      (остаток == длина)
        значения '("{") $ начало
      (шаблон[остаток] == #\} && запятая)
        значения
          слова ++ слово
          остаток + 1
      (шаблон[остаток] == #\})
        значения слово $ остаток + 1
      (шаблон[остаток] == #\,)
         прочитать-группу
           остаток + 1           
           слова ++ слово
           истина
      иначе
        значения '("{") $ начало
        
  значения ответ _ = проход 0 '("") ложь
  ответ

слить список . ещё-списки =
  если пустой? ещё-списки тогда
    список
    иначе
    применить слить
      применить добавить
        отобразить
          функция (строка1)
            отобразить
              функция (строка2) $ строка1 ++ строка2
              первый ещё-списки
          список
      оставшиеся ещё-списки

диапазон слово =
  длина = длина-строки слово
  конец = длина - 2
  пусть цикл (позиция(1))
    если
      (позиция >= конец)
        список слово
      (слово[позиция] == #\. && слово[позиция + 1] == #\.)
        если длина == 4 тогда
          диапазон-символов
            литера->число слово[0]
            литера->число слово[3]
          иначе
          диапазон-чисел
            подстрока слово 0 позиция
            подстрока слово $ позиция + 2
      иначе
        цикл $ позиция + 1
        
диапазон-символов начало конец =
  элемент число =
    строка $ число->литера число
  диапазон-элементов элемент начало конец

диапазон-чисел начало конец =
  начальное-число = строка->число начало
  конечное-число = строка->число конец
  если точное-целое? начальное-число && точное-целое? конечное-число тогда
    диапазон-элементов число->строка начальное-число конечное-число
    иначе
    начало ++ ".." ++ конец

диапазон-элементов элемент начало конец =
  если
    (начало > конец)
      элемент начало : диапазон-элементов элемент (начало - 1) конец
    (начало < конец)
      элемент начало : диапазон-элементов элемент (начало + 1) конец
    иначе
      список $ элемент начало
> разбор "/path/to/{foo,ba{r..z}}.txt"
  
'("/path/to/foo.txt"
  "/path/to/bar.txt"
  "/path/to/bas.txt"
  "/path/to/bat.txt"
  "/path/to/bau.txt"
  "/path/to/bav.txt"
  "/path/to/baw.txt"
  "/path/to/bax.txt"
  "/path/to/bay.txt"
  "/path/to/baz.txt")

> разбор "/path/to/{foo,ba{r,z}}.txt"
  
'("/path/to/foo.txt" "/path/to/bar.txt" "/path/to/baz.txt")

> разбор "~/{.local/share,.config,.cache}/{foo,bar}-package"
  
'("~/.local/share/foo-package" "~/.local/share/bar-package" "~/.config/foo-package" "~/.config/bar-package" "~/.cache/foo-package" "~/.cache/bar-package")

> разбор "foo-{15..1}"
  
'("foo-15" "foo-14" "foo-13" "foo-12" "foo-11" "foo-10" "foo-9" "foo-8" "foo-7" "foo-6" "foo-5" "foo-4" "foo-3" "foo-2" "foo-1")

Исправление monk, :

#!1

разбор шаблон =
  длина = длина-строки шаблон
  проход позиция результат в-скобках =
    если
      (позиция == длина)
        значения результат позиция
      (в-скобках && (шаблон[позиция] == #\} || шаблон[позиция] == #\,))
        если пустой? $ оставшиеся результат тогда
          значения диапазон(результат[0]) позиция
          иначе
          значения результат позиция
      (шаблон[позиция] == #\{)
        значения в-группе после-группы = прочитать-группу (позиция + 1)
        проход после-группы слить(результат в-группе) в-скобках
      (позиция < длина - 1 && шаблон[позиция] == #\\)
        проход
          позиция + 2
          слить результат
            список $ строка шаблон[позиция + 1]
          в-скобках
      иначе
        проход
          позиция + 1
          слить результат
            список $ строка шаблон[позиция]
          в-скобках

  прочитать-группу начало слова(пустой-список) запятая(ложь) =
    значения слово остаток = проход начало '("") истина
    если
      (остаток == длина)
        значения '("{") $ начало
      (шаблон[остаток] == #\} && запятая)
        значения
          слова ++ слово
          остаток + 1
      (шаблон[остаток] == #\} && пустой? слова)
        значения слово $ остаток + 1
      (шаблон[остаток] == #\,)
         прочитать-группу
           остаток + 1           
           слова ++ слово
           истина
      иначе
        значения '("{") $ начало
        
  значения ответ _ = проход 0 '("") ложь
  ответ

слить список . ещё-списки =
  если пустой? ещё-списки тогда
    список
    иначе
    применить слить
      применить добавить
        отобразить
          функция (строка1)
            отобразить
              функция (строка2) $ строка1 ++ строка2
              первый ещё-списки
          список
      оставшиеся ещё-списки

диапазон слово =
  длина = длина-строки слово
  конец = длина - 2
  пусть цикл (позиция(1))
    если
      (позиция >= конец)
        список слово
      (слово[позиция] == #\. && слово[позиция + 1] == #\.)
        если длина == 4 тогда
          диапазон-символов
            литера->число слово[0]
            литера->число слово[3]
          иначе
          диапазон-чисел
            подстрока слово 0 позиция
            подстрока слово $ позиция + 2
      иначе
        цикл $ позиция + 1
        
диапазон-символов начало конец =
  элемент число =
    строка $ число->литера число
  диапазон-элементов элемент начало конец

диапазон-чисел начало конец =
  начальное-число = строка->число начало
  конечное-число = строка->число конец
  если точное-целое? начальное-число && точное-целое? конечное-число тогда
    диапазон-элементов число->строка начальное-число конечное-число
    иначе
    начало ++ ".." ++ конец

диапазон-элементов элемент начало конец =
  если
    (начало > конец)
      элемент начало : диапазон-элементов элемент (начало - 1) конец
    (начало < конец)
      элемент начало : диапазон-элементов элемент (начало + 1) конец
    иначе
      список $ элемент начало
> разбор "/path/to/{foo,ba{r..z}}.txt"
  
'("/path/to/foo.txt"
  "/path/to/bar.txt"
  "/path/to/bas.txt"
  "/path/to/bat.txt"
  "/path/to/bau.txt"
  "/path/to/bav.txt"
  "/path/to/baw.txt"
  "/path/to/bax.txt"
  "/path/to/bay.txt"
  "/path/to/baz.txt")

> разбор "/path/to/{foo,ba{r,z}}.txt"
  
'("/path/to/foo.txt" "/path/to/bar.txt" "/path/to/baz.txt")

> разбор "~/{.local/share,.config,.cache}/{foo,bar}-package"
  
'("~/.local/share/foo-package" "~/.local/share/bar-package" "~/.config/foo-package" "~/.config/bar-package" "~/.cache/foo-package" "~/.cache/bar-package")

> разбор "foo-{15..1}"
  
'("foo-15" "foo-14" "foo-13" "foo-12" "foo-11" "foo-10" "foo-9" "foo-8" "foo-7" "foo-6" "foo-5" "foo-4" "foo-3" "foo-2" "foo-1")

Исходная версия monk, :

#!1

разбор шаблон =
  длина = длина-строки шаблон
  проход позиция результат в-скобках =
    если
      (позиция == длина)
        значения результат позиция
      (в-скобках && (шаблон[позиция] == #\} || шаблон[позиция] == #\,))
        если пустой? $ оставшиеся результат тогда
          значения диапазон(результат[0]) позиция
          иначе
          значения результат позиция
      (шаблон[позиция] == #\{)
        значения в-группе после-группы = прочитать-группу (позиция + 1)
        проход после-группы слить(результат в-группе) в-скобках
      (позиция < длина - 1 && шаблон[позиция] == #\\)
        проход
          позиция + 2
          слить результат
            список $ строка шаблон[позиция + 1]
          в-скобках
      иначе
        проход
          позиция + 1
          слить результат
            список $ строка шаблон[позиция]
          в-скобках

  прочитать-группу начало слова(пустой-список) запятая(ложь) =
    значения слово остаток = проход начало '("") истина
    если
      (остаток == длина)
        значения '("{") $ начало
      (шаблон[остаток] == #\} && запятая)
        значения
          слова ++ слово
          остаток + 1
      (шаблон[остаток] == #\} && пустой? слова)
        значения
          слово
          остаток + 1
      (шаблон[остаток] == #\})
        значения
          слить '("{") (слова ++ слово) '("}")
          остаток + 1
      (шаблон[остаток] == #\,)
         прочитать-группу
           остаток + 1           
           слова ++ слово
           истина
      иначе
        значения '("{") $ начало
        
  значения ответ _ = проход 0 '("") ложь
  ответ

слить список . ещё-списки =
  если пустой? ещё-списки тогда
    список
    иначе
    применить слить
      применить добавить
        отобразить
          функция (строка1)
            отобразить
              функция (строка2) $ строка1 ++ строка2
              первый ещё-списки
          список
      оставшиеся ещё-списки

диапазон слово =
  длина = длина-строки слово
  конец = длина - 2
  пусть цикл (позиция(1))
    если
      (позиция >= конец)
        список слово
      (слово[позиция] == #\. && слово[позиция + 1] == #\.)
        если длина == 4 тогда
          диапазон-символов
            литера->число слово[0]
            литера->число слово[3]
          иначе
          диапазон-чисел
            подстрока слово 0 позиция
            подстрока слово $ позиция + 2
      иначе
        цикл $ позиция + 1
        
диапазон-символов начало конец =
  элемент число =
    строка $ число->литера число
  диапазон-элементов элемент начало конец

диапазон-чисел начало конец =
  начальное-число = строка->число начало
  конечное-число = строка->число конец
  если точное-целое? начальное-число && точное-целое? конечное-число тогда
    диапазон-элементов число->строка начальное-число конечное-число
    иначе
    начало ++ ".." ++ конец

диапазон-элементов элемент начало конец =
  если
    (начало > конец)
      элемент начало : диапазон-элементов элемент (начало - 1) конец
    (начало < конец)
      элемент начало : диапазон-элементов элемент (начало + 1) конец
    иначе
      список $ элемент начало
> разбор "/path/to/{foo,ba{r..z}}.txt"
  
'("/path/to/foo.txt"
  "/path/to/bar.txt"
  "/path/to/bas.txt"
  "/path/to/bat.txt"
  "/path/to/bau.txt"
  "/path/to/bav.txt"
  "/path/to/baw.txt"
  "/path/to/bax.txt"
  "/path/to/bay.txt"
  "/path/to/baz.txt")

> разбор "/path/to/{foo,ba{r,z}}.txt"
  
'("/path/to/foo.txt" "/path/to/bar.txt" "/path/to/baz.txt")

> разбор "~/{.local/share,.config,.cache}/{foo,bar}-package"
  
'("~/.local/share/foo-package" "~/.local/share/bar-package" "~/.config/foo-package" "~/.config/bar-package" "~/.cache/foo-package" "~/.cache/bar-package")

> разбор "foo-{15..1}"
  
'("foo-15" "foo-14" "foo-13" "foo-12" "foo-11" "foo-10" "foo-9" "foo-8" "foo-7" "foo-6" "foo-5" "foo-4" "foo-3" "foo-2" "foo-1")