Нужен пример читаемого кода St

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|

Нужен пример читаемого кода St

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Alex Kogan
topaz 1> run
(Человек родился: Date сегодня)
когдаРодился
%
[63580161  Date]         a Date
  year                2014
  dayOfYear           324
topaz 1> level 0
topaz 1> obj **
[63580161  Date]         20/11/2014

topaz 1> run
Человек
%
[63560193  Человек class] Человек


topaz 1> run
Человек fileOutClass
%
! ------------------- Class definition for Человек
doit
Object subclass: 'Человек'
  instVarNames: #( dateOfBirth)
  classVars: #()
  classInstVars: #()
  poolDictionaries: #()
  inDictionary: UserGlobals
  options: #()

%

doit
Человек comment:
''
%
doit
Человек category: 'User Classes'
%
! ------------------- Remove existing behavior from Человек
doit
Человек removeAllMethods.
Человек class removeAllMethods.
%
! ------------------- Class methods for Человек
category: 'creation'
classmethod: Человек
родился: aDate
     ^self new когдаРодился: aDate; yourself
%
category: 'creation'
classmethod: Человек
родился
  ^self new когдаРодился: Date сегодня;
      yourself
%
! ------------------- Instance methods for Человек
category: ''
method: Человек
когдаРодился
  ^dateOfBirth
%
category: 'creation'
method: Человек
когдаРодился: aDate
   dateOfBirth:= aDate
%

2014-11-20 13:09 GMT-08:00 Vladimir Musulainen <[hidden email]>:

> Для статьи в раздел читать текст на St легче, чем на
> js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
> нужен пример хорошо читаемого кода на смоллтолке
> Сможете предложить лучше, чем придумал я?
>
> document := Document new.
> Picture := Picture fromFile: '/Users/user/pictures/image.png'.
> document insertPicture: picture onPageNumber: 1 withOffset: 100@100.
> Printer default print: document.
> Person take: document andPutInto: (Folder on '/Users/user/documents')
>
> --
> --
> http://groups.google.ru/group/sugr
> ---
> Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk
> User Group".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес [hidden email].
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

semka.novikov
Так, на правах мнения.
Я заинтересовался, в своё время, Smalltalk'ом через Io (http://iolanguage.org), который мне казался смолтоком с приличным синтаксисом.

Когда я впервые полез читать код на Smalltalk у меня шевелились все волосы на теле, потому что я не понимал вообще нихрена.

Если вам надо показать читабельность Smalltalk кода, то для начала надо объяснить его синтаксис хотя бы в общих чертах.

После этого код на St действительно просто читается.

Очень не рекомендую на хабре постить исходники с русскими именами классов и методов, вас моментально заминусуют с кучей комментариев вида "Один Эс, лол! Присваивания как в паскале, лол!"

Желательно показывать исходники чего-то полезного. Например возьмите за основу одно из триллиона видео "Блог на Сисайде за 15 минут".

Удачи вам с хабром :)

пятница, 21 ноября 2014 г., 10:03:30 UTC+5 пользователь Vladimir Musulainen написал:
Издеваетесь?
Я вот мало чего понял, а про читаемость..

пятница, 21 ноября 2014 г., 4:32:11 UTC+3 пользователь Саша написал:
topaz 1> run
(Человек родился: Date сегодня)
когдаРодился
%
[63580161  Date]         a Date
  year                2014
  dayOfYear           324
topaz 1> level 0
topaz 1> obj **
[63580161  Date]         20/11/2014

topaz 1> run
Человек
%
[63560193  Человек class] Человек


topaz 1> run
Человек fileOutClass
%
! ------------------- Class definition for Человек
doit
Object subclass: 'Человек'
  instVarNames: #( dateOfBirth)
  classVars: #()
  classInstVars: #()
  poolDictionaries: #()
  inDictionary: UserGlobals
  options: #()

%

doit
Человек comment:
''
%
doit
Человек category: 'User Classes'
%
! ------------------- Remove existing behavior from Человек
doit
Человек removeAllMethods.
Человек class removeAllMethods.
%
! ------------------- Class methods for Человек
category: 'creation'
classmethod: Человек
родился: aDate
     ^self new когдаРодился: aDate; yourself
%
category: 'creation'
classmethod: Человек
родился
  ^self new когдаРодился: Date сегодня;
      yourself
%
! ------------------- Instance methods for Человек
category: ''
method: Человек
когдаРодился
  ^dateOfBirth
%
category: 'creation'
method: Человек
когдаРодился: aDate
   dateOfBirth:= aDate
%

2014-11-20 13:09 GMT-08:00 Vladimir Musulainen :

> Для статьи в раздел читать текст на St легче, чем на
> js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
> нужен пример хорошо читаемого кода на смоллтолке
> Сможете предложить лучше, чем придумал я?
>
> document := Document new.
> Picture := Picture fromFile: '/Users/user/pictures/image.png'.
> document insertPicture: picture onPageNumber: 1 withOffset: 100@100.
> Printer default print: document.
> Person take: document andPutInto: (Folder on '/Users/user/documents')
>
> --
 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Alex Kogan
Читабельность дело вообще сугубо личное.

2014-11-20 21:18 GMT-08:00 Sёmka Novikov <[hidden email]>:

> Так, на правах мнения.
> Я заинтересовался, в своё время, Smalltalk'ом через Io
> (http://iolanguage.org), который мне казался смолтоком с приличным
> синтаксисом.
>
> Когда я впервые полез читать код на Smalltalk у меня шевелились все волосы
> на теле, потому что я не понимал вообще нихрена.
>
> Если вам надо показать читабельность Smalltalk кода, то для начала надо
> объяснить его синтаксис хотя бы в общих чертах.
>
> После этого код на St действительно просто читается.
>
> Очень не рекомендую на хабре постить исходники с русскими именами классов и
> методов, вас моментально заминусуют с кучей комментариев вида "Один Эс, лол!
> Присваивания как в паскале, лол!"
>
> Желательно показывать исходники чего-то полезного. Например возьмите за
> основу одно из триллиона видео "Блог на Сисайде за 15 минут".
>
> Удачи вам с хабром :)
>
> пятница, 21 ноября 2014 г., 10:03:30 UTC+5 пользователь Vladimir Musulainen
> написал:
>>
>> Издеваетесь?
>> Я вот мало чего понял, а про читаемость..
>>
>> пятница, 21 ноября 2014 г., 4:32:11 UTC+3 пользователь Саша написал:
>>>
>>> topaz 1> run
>>> (Человек родился: Date сегодня)
>>> когдаРодился
>>> %
>>> [63580161  Date]         a Date
>>>   year                2014
>>>   dayOfYear           324
>>> topaz 1> level 0
>>> topaz 1> obj **
>>> [63580161  Date]         20/11/2014
>>>
>>> topaz 1> run
>>> Человек
>>> %
>>> [63560193  Человек class] Человек
>>>
>>>
>>> topaz 1> run
>>> Человек fileOutClass
>>> %
>>> ! ------------------- Class definition for Человек
>>> doit
>>> Object subclass: 'Человек'
>>>   instVarNames: #( dateOfBirth)
>>>   classVars: #()
>>>   classInstVars: #()
>>>   poolDictionaries: #()
>>>   inDictionary: UserGlobals
>>>   options: #()
>>>
>>> %
>>>
>>> doit
>>> Человек comment:
>>> ''
>>> %
>>> doit
>>> Человек category: 'User Classes'
>>> %
>>> ! ------------------- Remove existing behavior from Человек
>>> doit
>>> Человек removeAllMethods.
>>> Человек class removeAllMethods.
>>> %
>>> ! ------------------- Class methods for Человек
>>> category: 'creation'
>>> classmethod: Человек
>>> родился: aDate
>>>      ^self new когдаРодился: aDate; yourself
>>> %
>>> category: 'creation'
>>> classmethod: Человек
>>> родился
>>>   ^self new когдаРодился: Date сегодня;
>>>       yourself
>>> %
>>> ! ------------------- Instance methods for Человек
>>> category: ''
>>> method: Человек
>>> когдаРодился
>>>   ^dateOfBirth
>>> %
>>> category: 'creation'
>>> method: Человек
>>> когдаРодился: aDate
>>>    dateOfBirth:= aDate
>>> %
>>>
>>> 2014-11-20 13:09 GMT-08:00 Vladimir Musulainen :
>>> > Для статьи в раздел читать текст на St легче, чем на
>>> > js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
>>> > нужен пример хорошо читаемого кода на смоллтолке
>>> > Сможете предложить лучше, чем придумал я?
>>> >
>>> > document := Document new.
>>> > Picture := Picture fromFile: '/Users/user/pictures/image.png'.
>>> > document insertPicture: picture onPageNumber: 1 withOffset: 100@100.
>>> > Printer default print: document.
>>> > Person take: document andPutInto: (Folder on '/Users/user/documents')
>>> >
>>> > --
>>>
>
> --
> --
> http://groups.google.ru/group/sugr
> ---
> Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk
> User Group".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес [hidden email].
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Dennis Schetinin
In reply to this post by vmusulainen-2
Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:
Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Dennis Schetinin
Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:
Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Yuriy Mironenko
Простой (но полностью рабочий) пример:
z:= ZipArchive new.
z addString: 'Hello, world!' as: 'test.txt'.
z addString: 'Smalltalk Is Easy' as: '/dir/again.txt'.
z writeToFileNamed: (OSEnvironment default at: 'HOME') asPath / 'test.zip'.

Последнюю строчку можно для простоты заменить на 
z writeToFileNamed: 'test.zip'.

Но, поскольку при этом файл запишется в директорию с образом, у пользователей убунты, установивших Фаро из репозитария, могут возникнуть проблемы с обнаружением этого файла.

Пример реального метода на той же основе:
generateXLSX
zip:= ZipArchive new.
zip addString: self workbook_xml as: 'workbook.xml'.
zip addString: self worksheet_xml as: 'worksheet.xml'.
zip addString: self content_types_xml as: '[Content_Types].xml'.
zip addString: self rels as: '_rels/.rels'.
zip addString: self workbook_xml_rels as: '_rels/workbook.xml.rels'.
zip writeToFileNamed: (FileDirectory default / workbook filename) fullName.


Почти реальный пример работы "с документом"
workbook := TabularWorkbook withSheets: 1.
workbook filename: 'Test.xlsx'.

sheet := workbook worksheets first.

sheet
at: 1@1 putData: '-';
at: 2@1 putData: 'colspan test';
at: 1@2 putData: 'rowspan test';
at: 2@2 putData: 777.77.

(sheet cells at: 2@1) colspan: 3.
(sheet cells at: 1@2) rowspan: 3.

XLSXExporter exportToFile: workbook.

"Почти" реальность состоит в последней строчке.
Сейчас, из-за грязности кода, оно так не работает, класс XLSXExporter называется TabularExperimenting и генерировать таблицу приходится внутри этого класса. Просто потому что я писал впопыхах, лишь бы увидеть, что оно вообще может работать.
Если нужно, я могу сделать так, чтобы этот пример был полностью рабочим, включая последнюю строчку.

21 ноября 2014 г., 8:58 пользователь Dennis Schetinin <[hidden email]> написал:
Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:

Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Denis Kudriashov
Пример из Mocketry. В общем, Mocketry была попыткой сделать максимально "прозрачный" и читаемый mocks-framework:

Behavior specifications

  • ordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should strictly satisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should lenient satisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario
  • ordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

Argument constraints DSL:

  • mock someMessageWith: Any.
  • mock messageWith: 'concrete object'.
  • mock messageWith: (Kind of: Integer).
  • mock messageWith: (Equal to: 10.222 within: 0.01)
  • mock messageWith: (Satisfying for: [:arg | arg > 0])
  • mock messageWith: (Instance of: Float) & (Satisfying for: [:arg | arg > 10]).
  • mock messageWith: (Satisfying for: [:arg | arg > 10]) | (Satisfying for: [:arg | arg < 100]).
  • ...

Specifications on message context

  • mock someMessage when: [someObject] is: 'state spec or concrete object'
  • mock someMessage when: [someObject] is: (Kind of: Number)
  • mock someMessage when: [someObject] satisfy: [:anObject | true or: false].
  • mock someMessage shouldBeAsynchronous
  • ...

Message send usage rules

  • mock someMessage useArbitrary
  • mock someMessage useOnce
  • mock someMessage useAtLeast: 3
  • mock someMessage useAtMost: 5
  • ...

Actions

  • mock someMessage willReturn: 'someObject'.
  • mock someMessage will: [2 + 3].
  • (mock someMessageWith: Any) will: [:arg | arg + 4]
  • ...

StateSpec DSL:

  • 5 should equals: 5
  • 5 should be an instance of: SmallInteger
  • [1 / 0] should raise: ZeroDivide
  • 6 should not equals: 5
  • 5.0 should not be an instance of: SmallInteger
  • [1 / 1] should not raise: ZeroDivide
  • ...

StateSpec DSL implemented based on pragmas:

Instance>>of: aClass
  <syntax: #(be an instance of: )>
  <syntax: #(be instance of: )>
  ^ClassSpec for: aClass

And you can write both expressions:

 4 should be an instance of: SmallInteger
 4 should be instance of: SmallInteger


21 ноября 2014 г., 9:43 пользователь Юрий Мироненко <[hidden email]> написал:
Простой (но полностью рабочий) пример:
z:= ZipArchive new.
z addString: 'Hello, world!' as: 'test.txt'.
z addString: 'Smalltalk Is Easy' as: '/dir/again.txt'.
z writeToFileNamed: (OSEnvironment default at: 'HOME') asPath / 'test.zip'.

Последнюю строчку можно для простоты заменить на 
z writeToFileNamed: 'test.zip'.

Но, поскольку при этом файл запишется в директорию с образом, у пользователей убунты, установивших Фаро из репозитария, могут возникнуть проблемы с обнаружением этого файла.

Пример реального метода на той же основе:
generateXLSX
zip:= ZipArchive new.
zip addString: self workbook_xml as: 'workbook.xml'.
zip addString: self worksheet_xml as: 'worksheet.xml'.
zip addString: self content_types_xml as: '[Content_Types].xml'.
zip addString: self rels as: '_rels/.rels'.
zip addString: self workbook_xml_rels as: '_rels/workbook.xml.rels'.
zip writeToFileNamed: (FileDirectory default / workbook filename) fullName.


Почти реальный пример работы "с документом"
workbook := TabularWorkbook withSheets: 1.
workbook filename: 'Test.xlsx'.

sheet := workbook worksheets first.

sheet
at: 1@1 putData: '-';
at: 2@1 putData: 'colspan test';
at: 1@2 putData: 'rowspan test';
at: 2@2 putData: 777.77.

(sheet cells at: 2@1) colspan: 3.
(sheet cells at: 1@2) rowspan: 3.

XLSXExporter exportToFile: workbook.

"Почти" реальность состоит в последней строчке.
Сейчас, из-за грязности кода, оно так не работает, класс XLSXExporter называется TabularExperimenting и генерировать таблицу приходится внутри этого класса. Просто потому что я писал впопыхах, лишь бы увидеть, что оно вообще может работать.
Если нужно, я могу сделать так, чтобы этот пример был полностью рабочим, включая последнюю строчку.

21 ноября 2014 г., 8:58 пользователь Dennis Schetinin <[hidden email]> написал:

Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:

Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Denis Kudriashov
Можно про прозрачную интеграцию с комплексными числами написать:
http://www.squeaksource.com/Complex.html

1 i + 5
7 + 20 i

21 ноября 2014 г., 10:45 пользователь Denis Kudriashov <[hidden email]> написал:
Пример из Mocketry. В общем, Mocketry была попыткой сделать максимально "прозрачный" и читаемый mocks-framework:

Behavior specifications

  • ordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should strictly satisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should lenient satisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario
  • ordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

Argument constraints DSL:

  • mock someMessageWith: Any.
  • mock messageWith: 'concrete object'.
  • mock messageWith: (Kind of: Integer).
  • mock messageWith: (Equal to: 10.222 within: 0.01)
  • mock messageWith: (Satisfying for: [:arg | arg > 0])
  • mock messageWith: (Instance of: Float) & (Satisfying for: [:arg | arg > 10]).
  • mock messageWith: (Satisfying for: [:arg | arg > 10]) | (Satisfying for: [:arg | arg < 100]).
  • ...

Specifications on message context

  • mock someMessage when: [someObject] is: 'state spec or concrete object'
  • mock someMessage when: [someObject] is: (Kind of: Number)
  • mock someMessage when: [someObject] satisfy: [:anObject | true or: false].
  • mock someMessage shouldBeAsynchronous
  • ...

Message send usage rules

  • mock someMessage useArbitrary
  • mock someMessage useOnce
  • mock someMessage useAtLeast: 3
  • mock someMessage useAtMost: 5
  • ...

Actions

  • mock someMessage willReturn: 'someObject'.
  • mock someMessage will: [2 + 3].
  • (mock someMessageWith: Any) will: [:arg | arg + 4]
  • ...

StateSpec DSL:

  • 5 should equals: 5
  • 5 should be an instance of: SmallInteger
  • [1 / 0] should raise: ZeroDivide
  • 6 should not equals: 5
  • 5.0 should not be an instance of: SmallInteger
  • [1 / 1] should not raise: ZeroDivide
  • ...

StateSpec DSL implemented based on pragmas:

Instance>>of: aClass
  <syntax: #(be an instance of: )>
  <syntax: #(be instance of: )>
  ^ClassSpec for: aClass

And you can write both expressions:

 4 should be an instance of: SmallInteger
 4 should be instance of: SmallInteger


21 ноября 2014 г., 9:43 пользователь Юрий Мироненко <[hidden email]> написал:

Простой (но полностью рабочий) пример:
z:= ZipArchive new.
z addString: 'Hello, world!' as: 'test.txt'.
z addString: 'Smalltalk Is Easy' as: '/dir/again.txt'.
z writeToFileNamed: (OSEnvironment default at: 'HOME') asPath / 'test.zip'.

Последнюю строчку можно для простоты заменить на 
z writeToFileNamed: 'test.zip'.

Но, поскольку при этом файл запишется в директорию с образом, у пользователей убунты, установивших Фаро из репозитария, могут возникнуть проблемы с обнаружением этого файла.

Пример реального метода на той же основе:
generateXLSX
zip:= ZipArchive new.
zip addString: self workbook_xml as: 'workbook.xml'.
zip addString: self worksheet_xml as: 'worksheet.xml'.
zip addString: self content_types_xml as: '[Content_Types].xml'.
zip addString: self rels as: '_rels/.rels'.
zip addString: self workbook_xml_rels as: '_rels/workbook.xml.rels'.
zip writeToFileNamed: (FileDirectory default / workbook filename) fullName.


Почти реальный пример работы "с документом"
workbook := TabularWorkbook withSheets: 1.
workbook filename: 'Test.xlsx'.

sheet := workbook worksheets first.

sheet
at: 1@1 putData: '-';
at: 2@1 putData: 'colspan test';
at: 1@2 putData: 'rowspan test';
at: 2@2 putData: 777.77.

(sheet cells at: 2@1) colspan: 3.
(sheet cells at: 1@2) rowspan: 3.

XLSXExporter exportToFile: workbook.

"Почти" реальность состоит в последней строчке.
Сейчас, из-за грязности кода, оно так не работает, класс XLSXExporter называется TabularExperimenting и генерировать таблицу приходится внутри этого класса. Просто потому что я писал впопыхах, лишь бы увидеть, что оно вообще может работать.
Если нужно, я могу сделать так, чтобы этот пример был полностью рабочим, включая последнюю строчку.

21 ноября 2014 г., 8:58 пользователь Dennis Schetinin <[hidden email]> написал:

Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:

Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Nikolay Kleptsov
Все познается в сравнении, нужно брать примеры из учебников по (C, C++, Java, Javascript и т.д.) и показывать их со Smalltalk реализацией. Сразу станет видно, что код получается компактный, интуитивный и читатель знающий другой язык программирования сможет легко понять и Smalltalk. Программа на другом языке будет как точка входа. Особенно показательно для циклов, условий, обработка коллекций

21 ноября 2014 г., 14:13 пользователь Denis Kudriashov <[hidden email]> написал:
Можно про прозрачную интеграцию с комплексными числами написать:
http://www.squeaksource.com/Complex.html

1 i + 5
7 + 20 i

21 ноября 2014 г., 10:45 пользователь Denis Kudriashov <[hidden email]> написал:

Пример из Mocketry. В общем, Mocketry была попыткой сделать максимально "прозрачный" и читаемый mocks-framework:

Behavior specifications

  • ordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should strictly satisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should lenient satisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario
  • ordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

Argument constraints DSL:

  • mock someMessageWith: Any.
  • mock messageWith: 'concrete object'.
  • mock messageWith: (Kind of: Integer).
  • mock messageWith: (Equal to: 10.222 within: 0.01)
  • mock messageWith: (Satisfying for: [:arg | arg > 0])
  • mock messageWith: (Instance of: Float) & (Satisfying for: [:arg | arg > 10]).
  • mock messageWith: (Satisfying for: [:arg | arg > 10]) | (Satisfying for: [:arg | arg < 100]).
  • ...

Specifications on message context

  • mock someMessage when: [someObject] is: 'state spec or concrete object'
  • mock someMessage when: [someObject] is: (Kind of: Number)
  • mock someMessage when: [someObject] satisfy: [:anObject | true or: false].
  • mock someMessage shouldBeAsynchronous
  • ...

Message send usage rules

  • mock someMessage useArbitrary
  • mock someMessage useOnce
  • mock someMessage useAtLeast: 3
  • mock someMessage useAtMost: 5
  • ...

Actions

  • mock someMessage willReturn: 'someObject'.
  • mock someMessage will: [2 + 3].
  • (mock someMessageWith: Any) will: [:arg | arg + 4]
  • ...

StateSpec DSL:

  • 5 should equals: 5
  • 5 should be an instance of: SmallInteger
  • [1 / 0] should raise: ZeroDivide
  • 6 should not equals: 5
  • 5.0 should not be an instance of: SmallInteger
  • [1 / 1] should not raise: ZeroDivide
  • ...

StateSpec DSL implemented based on pragmas:

Instance>>of: aClass
  <syntax: #(be an instance of: )>
  <syntax: #(be instance of: )>
  ^ClassSpec for: aClass

And you can write both expressions:

 4 should be an instance of: SmallInteger
 4 should be instance of: SmallInteger


21 ноября 2014 г., 9:43 пользователь Юрий Мироненко <[hidden email]> написал:

Простой (но полностью рабочий) пример:
z:= ZipArchive new.
z addString: 'Hello, world!' as: 'test.txt'.
z addString: 'Smalltalk Is Easy' as: '/dir/again.txt'.
z writeToFileNamed: (OSEnvironment default at: 'HOME') asPath / 'test.zip'.

Последнюю строчку можно для простоты заменить на 
z writeToFileNamed: 'test.zip'.

Но, поскольку при этом файл запишется в директорию с образом, у пользователей убунты, установивших Фаро из репозитария, могут возникнуть проблемы с обнаружением этого файла.

Пример реального метода на той же основе:
generateXLSX
zip:= ZipArchive new.
zip addString: self workbook_xml as: 'workbook.xml'.
zip addString: self worksheet_xml as: 'worksheet.xml'.
zip addString: self content_types_xml as: '[Content_Types].xml'.
zip addString: self rels as: '_rels/.rels'.
zip addString: self workbook_xml_rels as: '_rels/workbook.xml.rels'.
zip writeToFileNamed: (FileDirectory default / workbook filename) fullName.


Почти реальный пример работы "с документом"
workbook := TabularWorkbook withSheets: 1.
workbook filename: 'Test.xlsx'.

sheet := workbook worksheets first.

sheet
at: 1@1 putData: '-';
at: 2@1 putData: 'colspan test';
at: 1@2 putData: 'rowspan test';
at: 2@2 putData: 777.77.

(sheet cells at: 2@1) colspan: 3.
(sheet cells at: 1@2) rowspan: 3.

XLSXExporter exportToFile: workbook.

"Почти" реальность состоит в последней строчке.
Сейчас, из-за грязности кода, оно так не работает, класс XLSXExporter называется TabularExperimenting и генерировать таблицу приходится внутри этого класса. Просто потому что я писал впопыхах, лишь бы увидеть, что оно вообще может работать.
Если нужно, я могу сделать так, чтобы этот пример был полностью рабочим, включая последнюю строчку.

21 ноября 2014 г., 8:58 пользователь Dennis Schetinin <[hidden email]> написал:

Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:

Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Нужен пример читаемого кода St

Nikolay Kleptsov
Математические операции с использованием факториала

10000 factorial / 40 factorial

В этом примере читателю предложить решить на знакомом ему яз. прогр. Сколько строк кода получится?

21 ноября 2014 г., 19:05 пользователь Nikolay Kleptsov <[hidden email]> написал:
Все познается в сравнении, нужно брать примеры из учебников по (C, C++, Java, Javascript и т.д.) и показывать их со Smalltalk реализацией. Сразу станет видно, что код получается компактный, интуитивный и читатель знающий другой язык программирования сможет легко понять и Smalltalk. Программа на другом языке будет как точка входа. Особенно показательно для циклов, условий, обработка коллекций

21 ноября 2014 г., 14:13 пользователь Denis Kudriashov <[hidden email]> написал:

Можно про прозрачную интеграцию с комплексными числами написать:
http://www.squeaksource.com/Complex.html

1 i + 5
7 + 20 i

21 ноября 2014 г., 10:45 пользователь Denis Kudriashov <[hidden email]> написал:

Пример из Mocketry. В общем, Mocketry была попыткой сделать максимально "прозрачный" и читаемый mocks-framework:

Behavior specifications

  • ordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should strictly satisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should lenient satisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario
  • ordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andStrictlySatisfy:
  [mock1 someMessage willReturn: 'some'.
   mock2 someMessage2]
] runScenario
  • unordered behavior with raising exception spec:
[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2. ZeroDivide signal]
     should raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

[:mock1 :mock2 | 
  [mock1 someMessage. 
   mock2 someMessage2]
     should not raise: ZeroDivide andLenientSatisfy:
  [mock2 someMessage2.
   mock1 someMessage willReturn: 'some']
] runScenario

Argument constraints DSL:

  • mock someMessageWith: Any.
  • mock messageWith: 'concrete object'.
  • mock messageWith: (Kind of: Integer).
  • mock messageWith: (Equal to: 10.222 within: 0.01)
  • mock messageWith: (Satisfying for: [:arg | arg > 0])
  • mock messageWith: (Instance of: Float) & (Satisfying for: [:arg | arg > 10]).
  • mock messageWith: (Satisfying for: [:arg | arg > 10]) | (Satisfying for: [:arg | arg < 100]).
  • ...

Specifications on message context

  • mock someMessage when: [someObject] is: 'state spec or concrete object'
  • mock someMessage when: [someObject] is: (Kind of: Number)
  • mock someMessage when: [someObject] satisfy: [:anObject | true or: false].
  • mock someMessage shouldBeAsynchronous
  • ...

Message send usage rules

  • mock someMessage useArbitrary
  • mock someMessage useOnce
  • mock someMessage useAtLeast: 3
  • mock someMessage useAtMost: 5
  • ...

Actions

  • mock someMessage willReturn: 'someObject'.
  • mock someMessage will: [2 + 3].
  • (mock someMessageWith: Any) will: [:arg | arg + 4]
  • ...

StateSpec DSL:

  • 5 should equals: 5
  • 5 should be an instance of: SmallInteger
  • [1 / 0] should raise: ZeroDivide
  • 6 should not equals: 5
  • 5.0 should not be an instance of: SmallInteger
  • [1 / 1] should not raise: ZeroDivide
  • ...

StateSpec DSL implemented based on pragmas:

Instance>>of: aClass
  <syntax: #(be an instance of: )>
  <syntax: #(be instance of: )>
  ^ClassSpec for: aClass

And you can write both expressions:

 4 should be an instance of: SmallInteger
 4 should be instance of: SmallInteger


21 ноября 2014 г., 9:43 пользователь Юрий Мироненко <[hidden email]> написал:

Простой (но полностью рабочий) пример:
z:= ZipArchive new.
z addString: 'Hello, world!' as: 'test.txt'.
z addString: 'Smalltalk Is Easy' as: '/dir/again.txt'.
z writeToFileNamed: (OSEnvironment default at: 'HOME') asPath / 'test.zip'.

Последнюю строчку можно для простоты заменить на 
z writeToFileNamed: 'test.zip'.

Но, поскольку при этом файл запишется в директорию с образом, у пользователей убунты, установивших Фаро из репозитария, могут возникнуть проблемы с обнаружением этого файла.

Пример реального метода на той же основе:
generateXLSX
zip:= ZipArchive new.
zip addString: self workbook_xml as: 'workbook.xml'.
zip addString: self worksheet_xml as: 'worksheet.xml'.
zip addString: self content_types_xml as: '[Content_Types].xml'.
zip addString: self rels as: '_rels/.rels'.
zip addString: self workbook_xml_rels as: '_rels/workbook.xml.rels'.
zip writeToFileNamed: (FileDirectory default / workbook filename) fullName.


Почти реальный пример работы "с документом"
workbook := TabularWorkbook withSheets: 1.
workbook filename: 'Test.xlsx'.

sheet := workbook worksheets first.

sheet
at: 1@1 putData: '-';
at: 2@1 putData: 'colspan test';
at: 1@2 putData: 'rowspan test';
at: 2@2 putData: 777.77.

(sheet cells at: 2@1) colspan: 3.
(sheet cells at: 1@2) rowspan: 3.

XLSXExporter exportToFile: workbook.

"Почти" реальность состоит в последней строчке.
Сейчас, из-за грязности кода, оно так не работает, класс XLSXExporter называется TabularExperimenting и генерировать таблицу приходится внутри этого класса. Просто потому что я писал впопыхах, лишь бы увидеть, что оно вообще может работать.
Если нужно, я могу сделать так, чтобы этот пример был полностью рабочим, включая последнюю строчку.

21 ноября 2014 г., 8:58 пользователь Dennis Schetinin <[hidden email]> написал:

Вот несколько примеров, которые нравятся лично мне:

(String new: 32) collect: [ :each | 'abcdef' atRandom ]

Gofer it 
  smalltalkhubUser: 'PharoExtra' project: 'XMLSupport';
  configuration;
  loadStable

(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]

ZnClient new
  queryAt: #lng put: 5.33731;
  queryAt: #lat put: 50.9259;
  queryAt: #username put: 'demo';
  contentReader: [ :entity | 
    NeoJSONReader fromString: entity contents ];
  get




--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 9:48 пользователь Dennis Schetinin <[hidden email]> написал:

Я бы попробовал найти или сделать реальные примеры. Вдохновение (или даже готовый пример) можно поискать здесь: https://medium.com/@svenvc/elegant-pharo-code-bb590f0856d0


--

Best regards,


Dennis Schetinin


21 ноября 2014 г., 1:09 пользователь Vladimir Musulainen <[hidden email]> написал:

Для статьи в раздел читать текст на St легче, чем на js/ruby/c#/pythom/lisp/добавьте_сюда_ваш_любимый_язык
нужен пример хорошо читаемого кода на смоллтолке
Сможете предложить лучше, чем придумал я?

document := Document new.
Picture := Picture fromFile: '/Users/user/pictures/image.png'.
document insertPicture: picture onPageNumber: 1 withOffset: [hidden email].
Printer default print: document.
Person take: document andPutInto: (Folder on '/Users/user/documents')

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.