Что такое “семантика сокращения”? Объясните использование PLT Redex в термине неспециалиста

@S.Lott, если я ничего не импортирую в модуль помещения, что я получаю неопределенную ошибку вместо этого (я импортировал его в основной модуль как Вы, показал)

Traceback (новый вызов в последний раз):
Файл "C:\Projects\python\test\main.py", строка 6, в
Ben = Комната. AddPerson ('Ben', 'Более черный', 'Штекерный')
Файл "C:\Projects\python\test\room.py", строка 12, в человеке AddPerson
= CPerson (FirstName, SecondName, Gender, Айдахо)
NameError: глобальное имя 'CPerson' не определяется

кроме того, причина там различные модули - то, где я встретился с проблемой запуститься с контейнерного класса (ieg, комната) уже несколько сотен строк, таким образом, я хотел объекты в нем (например, люди) в отдельном файле.

РЕДАКТИРОВАНИЕ: main.py

from room import CRoom
from person import CPerson

Room = CRoom()

Ben = Room.AddPerson('Ben', 'Blacker', 'Male')
Tom = Room.AddPerson('Tom', 'Smith',   'Male')

Ben.Leave()
7
задан Lindsey Kuper 2 June 2013 в 02:42
поделиться

2 ответа

Семантика сокращения - это метод вычислений, который включает замену выражения эквивалентным (и, надеюсь, меньшим) выражением до тех пор, пока замена не станет невозможной. Если язык является полным по Тьюрингу, существуют выражения, которые никогда не перестают заменяться.

Редукция обычно обозначается стрелкой вправо, и это лучше всего объясняется на примере:

(3 + 7) + 5   -->  10 + 5  -->  15

Здесь показана стандартная семантика редукции для арифметических выражений. Выражение 15 не может быть сокращено дальше.

Надеюсь, это поможет.

15
ответ дан 6 December 2019 в 09:21
поделиться

Семантика редукции похожа (если не такая же?) На контекстную семантику. Любое выражение можно разбить на контекст и переиндексировать.

Практические основы языков программирования Роберта Харпера (черновик PDF доступен здесь ), раздел 9.3 Контекстная семантика неплохо объясняет их.

Пример:

print 5+4
**context: print [],  redex: 5+4
**evaluate redex: 9
**plug back into context

print 9
**context: [], redex: print 9
**evaluate redex: nil  ==> 9
**plug back into context

nil

Вы можете «вставить» редекс обратно в «дыру» контекста, чтобы получить: выведите 5 + 4. Оценка происходит на редексе. Вы разбиваете выражение на контекст + редекс, оцениваете редекс, чтобы получить новое выражение, вставляете его обратно в контекст, промываете и повторяете.

Вот немного более сложный пример, который требует знания абстрактной машины, которая оценивает лямбда-исчисление:

(lambda x.x+1) 5
**context: [] 5, redex: (lambda x.x+1)
**evaluate redex: <(lambda x.x+1), {environment}> <- create a closure
**plug back into context

<(lambda x.x+1), {}> 5
**context: [], redex: <(lambda x.x+1), {}> 5
**evaluate redex: x+1 where x:=5
**plug back into context

x+1 where x:=5
**context: []+1, redex: x
**evaluate redex: 5 (since x:=5 in our environment)
*plug back into context

5+1...
6

РЕДАКТИРОВАТЬ: Сложная часть - это распознать, где разбить выражение на контекст и переопределить. Это требует знания операционной семантики языка (какой «фрагмент» выражения вам нужно оценить дальше).

5
ответ дан 6 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: