Вы ничего не можете возвратить из функции в Схеме?

Еще один подход поверх @Ayoub Benayache's с использованием re, но для шаблонов регулярных выражений, если это необходимо.

import re

pattern = re.compile(r"^.*pattern.*$", re.M|re.I)

with open("in.txt", 'r') as infile:
    lines = pattern.findall(infile.read())
with open("out.txt", 'w') as outfile:
    outfile.write('\n'.join(lines))

10
задан Kai 19 March 2009 в 22:54
поделиться

7 ответов

Согласно спецификации R6RS:

Если <тест> приводит к #f, и никакой <альтернатива> указан, то результат выражения является неуказанным.

Поэтому взбеситесь, возвратите что-либо, что Вы хотите! Хотя #f или' () - то, что я, лично, ожидал бы.

10
ответ дан 3 December 2019 в 16:54
поделиться

Много Схем (PLT, Ikarus, Курица) имеют пустой тип, который можно произвести с (пустотой).

В PLT, по крайней мере, пусто то, что Вы получаете, когда Вы делаете (когда (<1 0) #t).

(PLT v4 не позволяет если без выражения else.)

2
ответ дан 3 December 2019 в 16:54
поделиться

Когда возвращаемое значение является неуказанным, можно возвратить то, что Вы любите; пользователь просто не может полагаться на то значение, являющееся там, никогда, или через реализации.

2
ответ дан 3 December 2019 в 16:54
поделиться

Схема не может действительно возвратить значения:

   > (values)

В R5RS однорукая форма того, если указан для возвращения неуказанного значения. Это означает Вам решать, решать который значение возвратиться. Довольно много Схем приняли решение представить определенное значение, названное "неуказанное значение", и возвращает то значение. Другие возвращают "невидимое значение" # <пусто>, и REPL записан таким образом, что это не печатает его.

   > (void)

В сначала можно было бы думать, это совпадает с (оценивает), но отметьте различие:

  > (length (list (void)))
  1

  > (length (list (values)))
  error>  context expected 1 value, received 0 values
  (Here (list ...) expected 1 value, but received nothing)

Если # <пусто> является частью списка, это печатается:

  > (list (void))
  (#<void>)
8
ответ дан 3 December 2019 в 16:54
поделиться

Во-первых, нормально требовать, если иметь выражение else, если это помогает Вам. Во-вторых, поддержки Схемы, возвращающие несколько значений от функции, поэтому если необходимо было реализовать возвращаемые значения как список, у Вас мог бы быть пустой список, показывают, что никакое возвращаемое значение не было дано.

(if (has-alternative if-expr)
  (eval (alternative if-expr)) ; make sure eval returns a list
  '())

Важное различие здесь: я не возвращаю пустой список, если не было никакого выражения else. Пустой список показывает, что не было никакого возвращаемого значения. Если бы было одно возвращаемое значение от выражения (скажите, что это было 3), то Вы имели бы (3) как возврат из оценки негласно. Точно так же возвращение нескольких значений от выражения заставило бы список возврата оценки иметь несколько элементов.

Наконец, во всей практичности, Вы могли действительно возвратить что-либо, если бы условие перестало работать и не еще существует, потому что это была бы ошибка в программе, чтобы попытаться получить значение функции, которая ничего не возвращает. По сути, это было бы задание программиста, не язык, для фиксации этой ошибки.

1
ответ дан 3 December 2019 в 16:54
поделиться

Странные люди возвратились бы 'nil или '|| (пустой символ). Проблема состоит в том, чтобы возвратить символ, который не может быть возвратом (eval (alternative if-expr)) избегать беспорядка.

Если что-нибудь может быть возвращено (eval (alternative if-expr)) и Вы все еще хотите знать, приехали ли Вы в эту альтернативу или нет, необходимо упаковать результат большей информацией:

(if (has-alternative if-expr)
  (cons #t (eval (alternative if-expr)))
  (cons #f #f))

Таким образом результатом является ячейка недостатков. Если его автомобиль является #t, то Вы evaled что-то. Если это - #f, Вы не сделали.

1
ответ дан 3 December 2019 в 16:54
поделиться

Что не так только с:

(if (has-alternative if-expr) (eval (alternative if-expr)))

?

0
ответ дан 3 December 2019 в 16:54
поделиться