Эта статья включает в себя список ссылок , связанных материалов или внешних ссылок , но ее источники остаются неясными, поскольку в ней отсутствуют встроенные цитаты . ( Июнь 2013 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Оригинальный автор (ы) | Стив Бирн, Паоло Бонзини |
---|---|
изначальный выпуск | 12 января 2003 г . |
Стабильный выпуск | 3.2.5 / 11 апреля 2013 г . |
Репозиторий | |
Операционная система | Unix ( Linux , Cygwin , Mac OS X / Дарвин ) |
Тип | Язык программирования |
Лицензия | GPL + LGPL |
Интернет сайт | https://www.gnu.org/software/smalltalk/ |
GNU Smalltalk - это реализация языка программирования Smalltalk от проекта GNU Project .
Реализация, в отличие от других сред Smalltalk, использует текстовые файлы для ввода программы и интерпретирует их содержимое как код Smalltalk. Таким образом, GNU Smalltalk действует скорее как интерпретатор, чем как среда в традиционном стиле Smalltalk.
GNU Smalltalk включает привязки для многих бесплатных программных библиотек, включая SQLite , libSDL , cairo , gettext и Expat .
Примеры [ править ]
Эти примеры работают только в GNU Smalltalk 3.0 и более поздних версиях. Классический пример Hello world :
'Привет, мир!' displayNl
Немного базового кода Smalltalk:
"Все, включая литерал, является объектом, поэтому это работает:" -199 abs "199" ' gst is cool ' size "11" ' Slick ' indexOf: $ c "4" ' Nice Day Isn ' ' t It? ' asLowercase asSet asSortedCollection asString "′? acdeinsty"
Коллекции [ править ]
Построение и использование массива :
a : = # ( 1 'привет' 3,14 1 2 ( 4 5 )) по адресу: 3 "3,14" обратном "((4 5) 2 1 3.14 'Привет' 1)" в активу "Set (1 'Привет' 3.14 2 (4 5))"
Создание и использование хеша :
hash : = Словарь от: { 'вода' -> 'мокрый' . 'огонь' -> 'горячий' } . hash at: 'fire' «Печать: горячая»hash keysAndValuesDo: [ : k : v | ( '% 1 -% 2' % { k . V }) displayNl ]«Печать: вода мокрая, огонь горячая»hash removeKey: 'water' «Удаляет 'water' -> 'wet'»
Блоки и итераторы [ править ]
Параметр, передающий блок в закрытие :
"запомнить блок". помните : = [ : name | ( 'Привет,% 1!' % { Имя }) displayNl ] .«Когда придет время - зови закрытие!» запомнить значение: 'world' "=> 'Hello, world!'"
Возврат замыканий из метода:
Целочисленное расширение [ asClosure [ | значение | значение : = self . ^ {[ : x | значение : = x ] . [ значение ]} ] ] блоков : = 10 asClosure . setter : = сначала блокирует . getter : = блокирует второй . газопоглотитель значение "=> 10" сеттер значение: 21 "=> 21" геттер значение "=> 21"
Использование блока для отправки информации вызывающему абоненту:
Integer продлить [ ifEven: evenBlock ifOdd: oddBlock [ ^ сама даже ifTrue: [ evenBlock значение: сам ] ifFalse: [ oddBlock значение: сам ] ] ]
Вызовите вышеуказанный метод, передав ему блок:
10 ifEven: [ : n | n / 2 ] ifOdd: [ : n | п * 3 + 1 ] "=> 5"
Перебор перечислений и массивов с использованием блоков:
array : = # ( 1 'hi' 3.14 ) array do: [ : item | item displayNl ] "=> 1" "=> привет" "=> 3,14"(С 3 по: 6 ) делать: [ : элемент | элемент displayNl ] "=> 3" "=> 4" "=> 5" "=> 6"
Такой метод, как inject: into:, может принимать как параметр, так и блок. Он выполняет итерацию по каждому члену списка, выполняя некоторые функции, сохраняя при этом агрегат. Это аналог функции foldl в языках функционального программирования . Например:
# ( 1 3 5 ) inject: 10 в: [ : sum : element | сумма + элемент ] "=> 19"
На первом проходе блок получает 10 (вводимый аргумент) как сумму и 1 (первый элемент массива) как элемент. Это возвращает 11. 11 затем становится суммой на следующем проходе, которая добавляется к 3 к get 14. 14 затем добавляется к 5, чтобы окончательно вернуть 19.
Блоки работают со многими встроенными методами:
( Имя файла : 'file.txt' ) withWriteStreamDo: [ : file | file nextPutAll: 'Написал текст.' ; nl ] "Файл автоматически закрывается здесь"( Имя файла : 'file.txt' ) linesDo: [ : each | каждый дисплейNl ]"=> Написал какой-то текст."
Используя перечисление и блок, чтобы возвести в квадрат числа от 1 до 10:
( От 1 до: 10 ) собрать: [ : x | x в квадрате ] "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
Классы [ править ]
Следующий код определяет класс с именем Person. Будучи производным от Magnitude, он автоматически определяет все методы сравнения, кроме one ( <
). С добавлением этого asSortedCollection
можно сортировать по возрасту. Обратите внимание, что мы можем переопределить способ печати / отображения объекта (по умолчанию используется совместное использование программной печати и пользовательского отображения) путем переопределения printOn:
.
Подкласс величины : Человек [ | имя возраст | Класс человека >> имя: имя возраст: возраст [ ^ себя новое имя: имя ; age: возраст ; себя ] < aPerson [ ^ self age < aPerson age ] name [ ^ name ] name: value [ name : = value ] age [ ^ age ] age: value [ age : = value ] printOn: aStream [ aStream nextPutAll: ( '% 1 ( % 2) ' % { name . Age })]]group : = { Имя человека : 'Дэн', возраст: 23 . Человек имя: «Марк» возраст: 63 . Человек имя: 'Cod' возраст: 16 .}.группа asSortedCollection обратная
Вышеупомянутые три имени напечатаны в обратном возрастном порядке:
OrderedCollection (Марка (63) Дан (23) Треска (16))
Исключения [ править ]
Исключение возникает при halt
вызове:
самостоятельная остановка
К исключению можно добавить необязательное сообщение; есть также error:
исключение другого типа:
self halt: 'This is a message' self error: 'This is a message'
Фактически это оболочки для фактического метода создания исключения signal
:
Сигнал ошибки Сигнал ошибки : «Недопустимые аргументы!»
Исключения обрабатываются on:do:
блоками.
[ Что - то , чтобы сделать ] на: Exception делать: [ : ех | обработать исключение в ex ]
Конечно, вы можете поймать только определенные исключения (и их подклассы):
[ Что - то , чтобы сделать ] по: Внимание делать: [ : ех | обработать исключение в ex ]
Можно использовать объект исключения, доступный для предложения обработчика, для выхода или возобновления первого блока; exiting - значение по умолчанию, но также может быть упомянуто явно:
[ Сигнал ошибки : 'foo' ] on: Ошибка do: [ : ex | ex return: 5 ]( Предупреждающий сигнал: 'что теперь?' ) PrintNl "=> nil"
[( Предупреждающий сигнал: 'что теперь?' ) PrintNl ] on: Предупреждение do: [ : ex | пример резюме: 5 ] "=> 5"
См. Также [ править ]
- Болтовня
- СТЕКЛО (программный пакет)
Внешние ссылки [ править ]
- Официальный веб-сайт