Если у него есть замыкания, могу ли я предположить, что я могу использовать многие сильные методы функционального стиля там?Имеет ли Smalltalk закрытие?
ответ
Да, у Smalltalk есть затворы. Следующий код создает замыкание, которое возвращает сумму двух аргументов:
sum := [ :a :b | a + b ].
Затворы объекты, которые могут быть созданы, прошли вокруг и манипулируют. Для того, чтобы оценить замыкание вы отправляете value
, value:
, value:value:
, ...
sum value: 1 value: 2.
Замыкание заметно используется с коллекциями для итерации, фильтра, карты, ... все значения коллекции:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
Кроме того, они используются для управляющих структур, как циклы:
[ iterator hasNext ]
whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
Также условными реализованы с использованием замыкания:
condition
ifTrue: [ do this ]
ifFalse: [ do that ]
Pharo имеет их:
все виртуальные машины имеют поддержку закрытия требуется для последних изображений
makeAdder := [ :x | [ :y | x + y ]].
add2 := makeAdder value: 2.
add2 value: 3.
Возвращения 5
.
Но обратите внимание, что
makeCounter := [ :init | [ init := init + 1. init ]].
не будет работать (Cannot store into ->init …
), как (например) в CL:
CL-USER> ((lambda (init) (lambda() (incf init))) 0)
#<COMPILED-LEXICAL-CLOSURE #xC7A495E>
CL-USER> (funcall *)
1
CL-USER> (funcall **)
2
CL-USER> (funcall ***)
3
Если я не ошибаюсь, это используется для работы перед был введен новый компилятор закрытия. Я не уверен, почему он не работает с новым компилятором.
Параметры блока и метода доступны только для чтения в Smalltalk. Однако некоторые древние компиляторы не проверяли правильность записи блоков. –
Спасибо за разъяснение, Лукас! – danlei
Но вы можете использовать локальную температуру блока, например: makeCounter: = [: init | | счет | count: = init. [count: = count + 1. count]]. (значение makeCounter: 3); стоимость –
- 1. Совместимы ли все реализации Smalltalk?
- 2. Smalltalk binding
- 3. функция имеет ли стрелка делегат атрибут как Groovy Закрытие
- 4. Имеет ли Objective-C закрытие, а C нет?
- 5. Smalltalk - Может написать программу Java в Smalltalk?
- 6. Smalltalk - printOn:
- 7. Smalltalk & Garbage Collection
- 8. Возврат сообщений в Smalltalk
- 9. Smalltalk Variadic функции
- 10. Smalltalk - Есть ли способ определить тип данных?
- 11. Есть ли инфраструктура инъекции зависимостей для Smalltalk?
- 12. Выход программы в smalltalk?
- 13. Smalltalk Fibonacci
- 14. Powerset - Smalltalk
- 15. Smalltalk Pharo
- 16. ReadWrite поток оценка «atEND» Smalltalk не имеет никакого эффекта
- 17. Рефакторинг метода в smalltalk
- 18. Можете ли вы клонировать закрытие?
- 19. Как проверить, имеет ли объектA все сообщение как объект B в smalltalk?
- 20. Текущая деятельность по развитию Smalltalk
- 21. Любой Smalltalk на .NET?
- 22. Smalltalk система типа
- 23. Пересылка сообщений в Smalltalk
- 24. Smalltalk клон-детектор
- 25. smalltalk public initialize
- 26. Smalltalk эквивалент метода фабрики?
- 27. Использование Smalltalk printFormat: метод
- 28. smalltalk обработка ошибок
- 29. Разбор RDF в Smalltalk
- 30. анимация в скрипе smalltalk
Ваш первый пример принимает только параметры, предоставленные сообщением 'значение: значение:', но ваш пример 'whileTrue:' содержит блоки, в которых используется переменная 'iterator', которая определена вне блока. Является ли один лямбда, а другой закрытием, или нет никакой разницы в Smalltalk? – quamrana
@quamrana: Нет (видимой) разницы. Большинство реализаций Smalltalk оптимизируют свои объекты замыкания в зависимости от использования внешних переменных. Все блокировки понимают одни и те же сообщения, хотя для вас, как разработчика, нет никакой разницы. –