Рубиновые блоки / Java замыкание в C

голоса
6

Я пытался понять, как Ruby, блоки работают, и делать, что я пытался реализовать их в C.

Один простой способ реализации затворов это передать void*в ограждающих стек до закрытия / функции , но в Ruby блоки также , кажется, ручка возвращается и разорвать заявление от объема , который использует блок.

loop do
  break i if (i >= 4000)
  i *= 2
end

Я думаю, что одна из предложений Затворов Java работает так же.

Итак, как бы реализовать в Ruby-блоки / Java-затворов в C?

Задан 21/08/2008 в 14:17
источник пользователем
На других языках...                            


3 ответов

голоса
10

Концепция закрытия требует понятия контекстов. Контекст C базируется на стеке и регистры процессора, так чтобы создать блок / закрытия, вы должны быть в состоянии манипулировать указатель стека в правильной (и реентерабельные) путь, и магазин / восстановление регистров по мере необходимости.

Как это делается интерпретаторов или виртуальных машин , чтобы иметь contextструктуру , или что - то подобное, и не использовать стек и регистры непосредственно. Эта структура отслеживает стек и , возможно некоторые регистры, если вы разрабатываете регистр на основе VM. По крайней мере, это самый простой способ сделать это (хоть чуть - чуть менее производительным , чем на самом деле отображения вещи правильно).

Ответил 21/08/2008 в 15:53
источник пользователем

голоса
3

Я на самом деле не реализовано ни одного из этого, так возьмите его с мешком соли.

Есть две части затвора: среды данных и окружающей среды кода. Как вы сказали, вы, вероятно, можете передать пустой * обрабатывать ссылки на данные. Вы могли бы, вероятно, использовать setjmp и longjmp осуществлять нелинейное управление потоком подскакивает, что разрыв Рубин требует.

Если вы хотите замыкания вы, вероятно, следует программировать на языке, который на самом деле их поддерживает. :-)

UPDATE: Интересные вещи происходят в Clang. Они прототип закрытия для C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html может оказаться интересным чтением.

Ответил 01/09/2008 в 17:18
источник пользователем

голоса
2

Там хороший набор слайдов на Ruby-блоков, как часть «Rails с Passion» курса:

Ruby_Blocks.pdf

Это охватывает, представляющий блок, как они получают передаются аргументы и казнены, а еще дальше в таких вещах, как объекты Proc. Это очень ясно объяснил.

Затем он может представлять интерес , чтобы посмотреть на то, как ребята JRuby обрабатываются эти в их разборе на Java. Посмотрите на источник в Codehaus .

Ответил 22/08/2008 в 13:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more