Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Ruby блоков/Java closures в C
Я пытался понять, как работают блоки Ruby, и для этого я пытался реализовать их в C.
Один из простых способов реализации closures-передать void* в окружающий стек в функцию closure/function, но блоки Ruby также обрабатывают операторы returns и break из области, которая использует блок.
loop do
break i if (i >= 4000)
i *= 2
end
Я думаю, что одно из предложений closures для Java работает так же.
Итак, как бы вы реализовали Ruby-blocks/Java-closures в C?
Понятие closures требует понятия контекстов. Контекст C основан на стеке и регистрах CPU, поэтому для создания block/closure, вам нужно иметь возможность корректно (и повторно) манипулировать указателем стека и хранить/восстанавливать регистры по мере необходимости.
Это делается интерпретаторами или виртуальными машинами таким образом, чтобы иметь структуру context или что-то подобное, а не использовать стек и регистры напрямую. Эта структура отслеживает стек и, возможно, некоторые регистры, если вы разрабатываете регистр на основе VM. По крайней мере, это самый простой способ сделать это (хотя и немного менее эффективный, чем на самом деле правильное отображение вещей).
Я на самом деле ничего из этого не реализовал, так что возьмите его с мешком соли.
Закрытие состоит из двух частей: среды данных и среды кода. Как вы уже сказали, вы, вероятно, можете передать void* для обработки ссылок на данные. Вероятно, вы можете использовать setjmp и longjmp для реализации нелинейных переходов потока управления, которые требуются для разрыва Ruby.
Если вы хотите closures, вы, вероятно, должны программировать на языке, который действительно поддерживает их. :-)
UPDATE: в Clang происходят интересные вещи. Они создали прототип закрытия для C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html может оказаться интересным чтением.
Есть хороший набор слайдов на блоках Ruby как часть курса "Rails with Passion":
Это охватывает представление блока, то, как они получают передаваемые Аргументы и выполняются, а также еще более глубокие вещи, такие как объекты Proc. Это очень ясно объясняется.
Тогда, возможно, будет интересно посмотреть, как ребята из JRuby обрабатывали их в своем разборе на Java. Взгляните на источник в codehaus .