GNU Smalltalk - GNU Smalltalk
Эта статья включает Список ссылок, связанное чтение или внешняя ссылка, но его источники остаются неясными, потому что в нем отсутствует встроенные цитаты.июнь 2013) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Оригинальный автор (ы) | Стив Бирн, Паоло Бонзини |
---|---|
изначальный выпуск | 12 января 2003 г. |
Стабильный выпуск | 3.2.5 / 11 апреля 2013 г. |
Репозиторий | |
Операционная система | Unix (Linux, Cygwin, Mac OS X / Дарвин ) |
Тип | Язык программирования |
Лицензия | GPL + LGPL |
Интернет сайт | https://www.gnu.org/software/smalltalk/ |
GNU Smalltalk это реализация Болтовня язык программирования посредством Проект GNU.
Реализация, в отличие от других сред Smalltalk, использует текстовые файлы для ввода программы и интерпретирует содержимое как код Smalltalk. Таким образом, GNU Smalltalk действует скорее как интерпретатор, чем как среда в традиционном стиле Smalltalk.
GNU Smalltalk включает привязки для многих бесплатных программных библиотек, включая SQLite, libSDL, Каир, gettext, и Эмигрант.
Примеры
Эти примеры работают только в GNU Smalltalk 3.0 и более поздних версиях. Классический Привет, мир пример:
'Привет, мир!' displayNl
Немного базового кода Smalltalk:
«Все, включая литерал, является объектом, так что это работает:»-199 пресс "199"'GST является прохладно' размер "11"'Slick' индекс: $ c "4"'Отлично День Isn''т Это?' как нижний регистр актив asSortedCollection asString "? Acdeinsty"
Коллекции
Создание и использование множество:
а := #(1 'Здравствуй' 3.14 1 2 (4 5))а в: 3 "3.14"а обеспечить регресс "((4 5) 2 1 3.14 'привет' 1)"а актив «Установить (1 'привет' 3,14 2 (4 5))»
Создание и использование хэш:
хэш := Словарь из: { 'воды' -> 'смачивать'. 'Огонь' -> 'горячей' }.хэш в: 'Огонь' «Отпечатки: горячие»хэш keysAndValuesDo: [ :k :v | ("% 1 - это% 2" % { k. v }) displayNl ]"Отпечатки: вода мокрая огонь горячий "хэш removeKey: 'воды' "Удаляет" воду "->" мокрый ""
Блоки и итераторы
Передача параметров блоку в качестве закрытие:
"запомнить блок".Помните := [ :имя | ("Привет,% 1!" % { имя }) displayNl ].«Когда придет время - зови закрытие!»Помните ценить: 'Мир'"=> 'Привет, мир!'"
Возврат замыканий из метода:
Целое число продлевать [ asClosure [ | ценить | ценить := себя. ^{ [ :Икс | ценить := Икс ]. [ ценить ] } ] ] блоки := 10 asClosure. сеттер := блоки первый. добытчик := блоки второй. добытчик ценить "=> 10" сеттер ценить: 21 "=> 21" добытчик ценить "=> 21"
Использование блока для отправки информации вызывающему абоненту:
Целое число продлевать [ ifEven: evenBlock ifOdd: oddBlock [ ^себя четное если правда: [ evenBlock ценить: себя ] ifFalse: [ oddBlock ценить: себя ] ] ]
Вызовите вышеуказанный метод, передав ему блок:
10 ifEven: [ :п | п / 2 ] ifOdd: [ :п | п * 3 + 1 ] "=> 5"
Перебор перечислений и массивов с использованием блоков:
множество := #(1 'Здравствуй' 3.14)множество делать: [ :элемент | элемент displayNl ]"=> 1""=> привет""=> 3.14"(3 к: 6) делать: [ :элемент | элемент displayNl ]"=> 3""=> 4""=> 5""=> 6"
Такой метод как вводить: в: может принимать как параметр, так и блок. Он выполняет итерацию по каждому члену списка, выполняя некоторые функции, сохраняя при этом агрегат. Это аналогично складка функционировать в функциональные языки программирования. Например:
#(1 3 5) вводить: 10 в: [ :сумма :элемент | сумма + элемент ] "=> 19"
На первом проходе блок получает 10 (вводимый аргумент) как сумму и 1 (первый элемент массива) как элемент. Это возвращает 11. 11 затем становится суммой на следующем проходе, которая добавляется к 3 к get 14. 14 затем добавляется к 5, чтобы окончательно вернуть 19.
Блоки работают со многими встроенными методами:
(Файл имя: 'file.txt') withWriteStreamDo: [ :файл | файл nextPutAll: «Написал какой-то текст».; нл ]«Файл здесь автоматически закрывается»(Файл имя: 'file.txt') линии [ :каждый | каждый displayNl ]"=> Написал какой-то текст."
Используя перечисление и блок, чтобы возвести в квадрат числа от 1 до 10:
(1 к: 10) собирать: [ :Икс | Икс в квадрате ] "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
Классы
Следующий код определяет класс с именем Person. Будучи производным от Magnitude, он автоматически определяет все методы сравнения, кроме одного (<
). С добавлением этого, asSortedCollection
можно сортировать по возрасту. Обратите внимание, что мы можем переопределить способ печати / отображения объекта (по умолчанию используется совместное использование программной печати и пользовательского отображения) путем переопределения printOn:
.
Величина подкласс: Человек [ | Назовите возраст | Человек учебный класс >> имя: имя возраст: возраст [ ^себя новый имя: имя; возраст: возраст; себя ] < персона [ ^себя возраст < персона возраст ] имя [ ^имя ] имя: ценить [ имя := ценить ] возраст [ ^возраст ] возраст: ценить [ возраст := ценить ] printOn: поток [ поток nextPutAll: ('%1 (%2)' % { имя. возраст }) ]]группа := { Человек имя: 'Дэн' возраст: 23. Человек имя: 'Отметка' возраст: 63. Человек имя: 'Треска' возраст: 16.}.группа asSortedCollection обеспечить регресс
Вышеупомянутые три имени напечатаны в обратном порядке возраста:
OrderedCollection (Марка (63) Дан (23) Треска (16))
Исключения
Исключение возникает с остановка
вызов:
себя остановка
К исключению можно добавить необязательное сообщение; есть также ошибка:
что вызывает исключение другого типа:
себя остановка: "Это сообщение"себя ошибка: "Это сообщение"
На самом деле это оболочки для фактического метода создания исключения, сигнал
:
Ошибка сигналОшибка сигнал: «Незаконные аргументы!»
Исключения обрабатываются на: делать:
блоки.
[ что нибудь к делать ] на: Исключение делать: [ :бывший | ручка исключение в бывший ]
Конечно, вы можете поймать только определенные исключения (и их подклассы):
[ что нибудь к делать ] на: Предупреждение делать: [ :бывший | ручка исключение в бывший ]
Можно использовать объект исключения, доступный для предложения обработчика, для выхода или возобновления первого блока; Exiting - значение по умолчанию, но также может быть упомянуто явно:
[ Ошибка сигнал: 'фу' ] на: Ошибка делать: [ :бывший | бывший возвращаться: 5 ](Предупреждение сигнал: 'что теперь?') printNl "=> ноль"[ (Предупреждение сигнал: 'что теперь?') printNl ] на: Предупреждение делать: [ :бывший | бывший продолжить: 5 ] "=> 5"