2016-12-30 4 views
1

Более конкретно, меня интересует одно конкретное свойство begin, где определения в его теле добавляются в окружающую область. Например.Можно ли определить макрос с теми же свойствами, что и форма начала?

(begin (define a 1) 
     (define b 2)) 
(+ a b) ; 3 

Было бы достаточно простой, чтобы определить новый макрос my-begin, что переводится на стандартный begin, но в моем конкретном случае использования мне нужен список всех идентификаторов, которые в настоящее время связаны в начинаются, так что я могут вводить/использовать их в другом месте.

Быть более конкретным относительно того, чего я хочу достичь: Я выясню, как построить оператор PAR/AND, который одновременно оценивает две ветви (или, по крайней мере, дает впечатление, учитывая контекст). Филиалы могут содержать операции блокировки. Сам PAR/AND возвращается после возвращения обеих ветвей. Любые определения становятся доступными в отдаленном объеме. Например:

(PAR/AND  
    (define a (do-something))  ; branch 1 
    (define b (do-something-else))) ; branch 2 
(+ a b) 

Я не совсем уверен, но как реализовать его (так как у меня есть некоторые дополнительные вещи, чтобы беспокоиться о), но делает a и b доступны за пределами сферы par/and, безусловно, то, что нужно происходят в какой-то момент.

+2

Звучит как проблема XY. Что вы на самом деле пытаетесь достичь? – Sylwester

+0

Возможно, вы правы. Я добавил еще несколько вопросов к вопросу. – Sam

ответ

3

Я бы полностью пропустил часть около define и просто убедился, что выражение выполняется параллельно, а затем, когда нити соединены, используйте values. В ракетке у вас есть define-values, где вы можете связать несколько значений глобальных имен, и он может быть использован, чтобы назвать значения, которые вы вычислили:

(define-values (a b) 
    (parallel/values (do-something) (do-something-else))) 
(+ a b) 
; ==> 1337 

paralell/values нужно быть синтаксически здесь, но так как выражения самих санки вы могли бы на самом деле держать это процедура, которая занимает санки:

(define-values (a b) 
    (parallel/values do-something do-something-else)) 
(+ a b) 
; ==> 1337 

Как вы видите, это не требует заказной begin вообще. Я ожидаю, что параллельные выражения приведут к закрытию, которое повлияет на define, чтобы это обойти эту червь и червей. define-valuesфактический define примитив в ракетке, если вы посмотрите на полностью расширенные программы из макрообмена с отключенным скрытием макроса.

+0

Я раньше не рассматривал проблему с этого угла и не думал об использовании 'define-values' таким образом. Это абсолютно «схематический» способ решения проблемы. Спасибо за понимание! – Sam

+0

Да, я тоже собирался это предложить. –

1

Существуют сложные способы сделать это, но похоже, что есть простой способ: не можете ли вы просто увеличить ваш макрос в begin?

+0

Хороший вопрос. Я не уверен, возможно ли это с учетом цели. Если бы мне нужен фактический параллелизм для ветвей, тогда «PAR/AND» создавал бы два потока для вычисления ветвей и в основном синхронизовал их. 'begin' мне не помогает. Подобная операция блокировки, которая может возникнуть в ветвях, на самом деле является более простой «ждать, пока не будет получено событие», поэтому я могу, возможно, включить ветвь в лямбда, которая выполняется после получения необходимых событий. Можно ли обеспечить «чистую» среду и после выполнения проверки, какие привязки были добавлены? – Sam