Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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"

См. Также [ править ]

  • Болтовня
  • СТЕКЛО (программный пакет)

Внешние ссылки [ править ]

  • Официальный веб-сайт