2013-09-03 4 views
3

Я играю с добавлением немного currying материала для BlockClosure.Динамическое создание BlockClosures?

Чтобы сделать это динамически (т. Е. Не жестко кодировать все случаи для различного количества аргументов исходного блока), мне нужно было бы построить BlockClosures динамически, чтобы передать различное количество аргументов.

Есть ли способ сделать это, даже если это связано с каким-то динамическим eval/compile?

+0

Видимо кто-то сделал это уже: HTTP: // code.google.com/p/pharo/issues/detail?id=1302 –

ответ

1

Является следующим, что вы ищете? В рабочем пространстве попробовать:

|myBlock| 
myBlock := Compiler evaluate: '[ 1 + 2 ]'. 

Теперь вы собрали блок из строки:

myBlock class -> BlockClosure 

и может оценить его:

myBlock value -> 3 
+0

Брутально, но ближе к ядру;), спасибо. Что-нибудь об АСТ, правда? –

4

Посмотрите на этих статьях Василий Быков:

Тем более, что я понял ваш вопрос был о разном количестве аргументов:

Однако, поскольку блоки Smalltalk не поддерживают эквивалент аргументов «rest» Lisp, метод curriedWithArguments: должен явно перечислять и обрабатывать все типы, которые мы реально ожидаем использовать при вызове блоков. Использование CurriedBlock вместо этого дает более приятный пример.

+0

См. мой второй ответ. – MartinW

 Смежные вопросы

  • Нет связанных вопросов^_^