IronSmalltalk  August 24th 2011   Todor Todorov
IronSmalltalk  Smalltalk for the Microsoft .Net DLR
Agenda•   History•   Motivation and Background•   Microsoft .Net DLR•   Message Sends and CallSites•   CallSite Binders•  ...
Smalltalk 1980
Smalltalk 1980
Smalltalk 1981
Smalltalk 2011
Smalltalk 2005
The World Today
The World Today
Smalltalking since 1998  Todor Todorov
BusinessApplications
Microsoft.Net Platform
Costly vs. Free?
Commodity!
Goal• X3J20 Compliant Smalltalk• First Class Member of the  DLR Family• Easy interop. with .Net• Decent Performance
PersonalChallenge
.NET DLR
.NET DLR
.NET DLR
Message Send
Message SendCommunication
Message SendTranscript show:   Hello, Edinburgh!.
Message SendTranscript show: Hello, Edinburgh!.TranscriptStream >> show: anObjectself       nextPutAll: anObject asString;...
Method LookupTranscript show: Hello, Edinburgh!.TranscriptStream >> show: anObjectself       nextPutAll: anObject asString...
Call SiteTranscript show: Hello, Edinburgh!.call1 := Message receiver: Transcript     selector: #show:     arguments: #(He...
Call SiteTranscript show: Hello, Edinburgh!.call1 := CallSite receiver: Transcript     selector: #show:     arguments: #(H...
Call SiteTranscript show: Hello, Edinburgh!.call1 := CallSite selector: #show:.call1   evaluateWithReceiver: Transcript   ...
Call Site BindersTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder:     (Binder selector: #show:).call1   eval...
Call Site BindersBinder >> bindFor: aReceiver     arguments: anArray^BindingRule for:    (aReceiver compiledMethodAt:     ...
Dynamic Objects Reflective Objects
Call Site BindersBinder >> bindFor: aReceiver     arguments: anArray^BindingRule for:    (aReceiver compiledMethodAt:     ...
Call Site BindersBinder >> bindFor: aReceiver     arguments: anArray^aReceiver bindEvaluateFor: self    arguments: anArray.
Call Site BindersObject >> bindEvaluateFor: aBinder     arguments: anArray^BindingRule for:    (self compiledMethodAt:    ...
Call Site Binders  … receiver can’t help us, then …fallbackBindInvokeFor: aReceiver     arguments: anArray^BindingRule for...
Expression Trees
Expression TreesAbstract Semantic Tree
Expression TreesAbstract Semantic TreeAbstract Syntax Tree
Expression TreesAbstract Semantic TreeAbstract Syntax TreeExpression trees model code
Expression TreesAbstract Semantic TreeAbstract Syntax TreeExpression trees model codeExpressions are used torepresent the ...
Expression TreessignString   ^self < 0      ifTrue: [ Negative ]      ifFalse: [ Positive ].
Expression TreessignString^Expression   condition: (Expression        lowerThan: self value: 0)   true: Negative   false: ...
Expression TreessignStringselfArg := Expression parameter: self.^Expression     condition: (Expression           lowerThan...
Expression TreesTranscriptStream>>show: anObjectself       nextPutAll: anObject.
Expression Treesself       nextPutAll: anObject.selfArg := Expression parameter: self.arg1 := Expression parameter: anObje...
Expression TreesBinder >> bindFor: aReceiver     arguments: anArray^BindingRule for:    (aReceiver compiledMethodAt:      ...
Expression TreesBinder >> bindFor: aReceiver     arguments: anArray^BindingRule expression: (Expression      dynamic: (Bin...
Code Pipeline
Code PipelineSmalltalk Sources
Code PipelineSmalltalk Sources            Smalltalk                               AST          Smalltalk Parser
Code PipelineSmalltalk Sources            Smalltalk               Expression                               AST            ...
Code PipelineSmalltalk Sources            Smalltalk               Expression              MSIL                            ...
Code PipelineSmalltalk Sources            Smalltalk               Expression              MSIL                            ...
PolymorphicInline Caching
CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder:     (Binder selector: #show:).call1   evaluateWithRe...
CachingBinder >> bindFor: aReceiver       arguments: anArraymethod := aReceiver value compiledMethodAt: #show:.” … magic …...
CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder:     (Binder selector: #show:).call1   evaluateWithRe...
CachingBinder >> bindFor: aReceiver       arguments: anArraymethod := aReceiver value compiledMethodAt: #show:.” … magic …...
CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder:     (Binder selector: #show:).call1   evaluateWithRe...
Restrictions• Restrictions can be more complex  •   For example, instance specific or object      version specific• Restri...
The Cache•   3 Levels of Caching:•   Level 0 : Rule for last call•   Level 1 : Last 10 rules•   Level 2 : 100 rules, share...
.NET DLR
Common Vocabulary• None Defined• De-Facto, the .Net class library• We aim at reusing the common  classes  – Example: Syste...
Demo
Summary
Components                                     Hosting                             Interchange InstallerIC Encoder        ...
HostingWindows Process  .Net AppDomain            .Net AppDomain    DLR Script Scope          Smalltalk Runtime      Small...
SpecificsSymbolsStringsSmalltalk Process#sender#respondsTo:Events
Object SpaceNo   Object Space ReflectionNo   #allInstancesNo   #allReferencesNo   #become:But #behaveLike: is possible!Deb...
Major Tech Companies
Good NewsUnicodeMulti ThreadedLarge Class LibraryWeb-HostableMIT License
Near FutureGenericsClass Library Importer     (or auto-integration)Finish Version 1.0Write Tests (…)
FutureGUI Integration (WinForms + WPF)SubSystems(Interactive) DebuggerVisual Studio IntegrationMixinsSubSystems / Namespac...
Questionshttp://ironsmalltalk.codeplex.com/   mailto:todor@scientia.dk
Callbacks                        List showItems:                             #( TT ST ).Workspace >> evaluateSmalltalk >> ...
Callbacks                        List >> showItems: anArray                         “ AddItems(anArray, self) ”           ...
Callbacks                        List.AddItems(string[] keys,                              dynamic stList)                ...
Callbacks                        List.AddItem(string[] keys,                              dynamic stList)                 ...
Callbacks                        List >> getItemText:                              aString                             ^se...
Callbacks                        .Net 4.0 has the dynamic                        keyword used for invoking                ...
Callbacks                        Native Name: GetItemText                        List >> getItemText:                     ...
Exceptions                        [ Transcript show:                             Hello, Edinburgh! ]                      ...
Exceptions                         BlockClosure >>                              on: exception                             ...
Exceptions                         BlockClosure >> value                              < Primitive >BlockClosure >> valueBl...
Exceptions                            TranscriptStream >>                                show: anObject                   ...
Exceptions                            String >> asString                                 ^self.String >> asStringTranscrip...
Exceptions                            TranscriptStream >>                                show: anObject                   ...
Exceptions                                 TranscriptStream >>                                     nextPutAll: aString    ...
Exceptions                            TranscriptStream >>                                show: anObject                   ...
Exceptions                               TranscriptStream >>                                   endEntry                   ...
Exceptions                            TranscriptStream >>                                show: anObject                   ...
Exceptions                         BlockClosure >> value                              < Primitive >BlockClosure >> valueBl...
Exceptions                         BlockClosure >>                              on: exception                             ...
Exceptions                        Transcript show:                             Hello, Edinburgh!.Workspace >> evaluateSmal...
Exceptions                                 TranscriptStream >>                                     nextPutAll: aString    ...
Exceptions                                 TranscriptStream >>                                     nextPutAll: aString    ...
Exceptions                                 .Net Exceptions                                 unwind the stackTranscriptStrea...
Exceptions                                 Smalltalk expects                                 resumableTranscriptStream >>n...
Exceptions                                 Must keep stack!Extra code here …BlockClosure >> valueTranscriptStream >>nextPu...
Exceptions                                 Unwinding is                                 executes asTranscriptStream >>next...
Exceptions                         List >> getItemText:                               aStringList >> getItemText:List.AddI...
Exceptions                         List >> getItemText:                               aStringList >> getItemText:List.AddI...
Exceptions                         List >> getItemText:                               aStringList >> getItemText:List.AddI...
Exceptions                         List >> getItemText:                               aStringList >> getItemText:List.AddI...
ExceptionsList >> getItemText:                         Exceptions mustList.AddItem()           integrate with thetry { … }...
ExceptionsNon-Resumable exceptions can bemapped to native .Net exceptions
ExceptionsNon-Resumable exceptions can bemapped to native .Net exceptionsResumable exceptions cannot bemapped to native .N...
IronSmalltalk
IronSmalltalk
IronSmalltalk
IronSmalltalk
IronSmalltalk
Upcoming SlideShare
Loading in …5
×

IronSmalltalk

938 views
854 views

Published on

ESUG 2011, Edinburgh

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
938
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

IronSmalltalk

  1. 1. IronSmalltalk August 24th 2011 Todor Todorov
  2. 2. IronSmalltalk Smalltalk for the Microsoft .Net DLR
  3. 3. Agenda• History• Motivation and Background• Microsoft .Net DLR• Message Sends and CallSites• CallSite Binders• Expression Trees• Code Pipeline• Polymorphic Inline Caching• Conclusion• Extras / Bonus24 August 2011 Todor Todorov 3 / 111
  4. 4. Smalltalk 1980
  5. 5. Smalltalk 1980
  6. 6. Smalltalk 1981
  7. 7. Smalltalk 2011
  8. 8. Smalltalk 2005
  9. 9. The World Today
  10. 10. The World Today
  11. 11. Smalltalking since 1998 Todor Todorov
  12. 12. BusinessApplications
  13. 13. Microsoft.Net Platform
  14. 14. Costly vs. Free?
  15. 15. Commodity!
  16. 16. Goal• X3J20 Compliant Smalltalk• First Class Member of the DLR Family• Easy interop. with .Net• Decent Performance
  17. 17. PersonalChallenge
  18. 18. .NET DLR
  19. 19. .NET DLR
  20. 20. .NET DLR
  21. 21. Message Send
  22. 22. Message SendCommunication
  23. 23. Message SendTranscript show: Hello, Edinburgh!.
  24. 24. Message SendTranscript show: Hello, Edinburgh!.TranscriptStream >> show: anObjectself nextPutAll: anObject asString; endEntry.
  25. 25. Method LookupTranscript show: Hello, Edinburgh!.TranscriptStream >> show: anObjectself nextPutAll: anObject asString; endEntry.
  26. 26. Call SiteTranscript show: Hello, Edinburgh!.call1 := Message receiver: Transcript selector: #show: arguments: #(Hello, Edinb… ).call1 evaluate.
  27. 27. Call SiteTranscript show: Hello, Edinburgh!.call1 := CallSite receiver: Transcript selector: #show: arguments: #(Hello, Edinb… ).call1 evaluate.
  28. 28. Call SiteTranscript show: Hello, Edinburgh!.call1 := CallSite selector: #show:.call1 evaluateWithReceiver: Transcript andArgs: #(Hello, Edinburgh).
  29. 29. Call Site BindersTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder: (Binder selector: #show:).call1 evaluateWithReceiver: Transcript andArgs: #(Hello, Edinburgh).
  30. 30. Call Site BindersBinder >> bindFor: aReceiver arguments: anArray^BindingRule for: (aReceiver compiledMethodAt: #show).
  31. 31. Dynamic Objects Reflective Objects
  32. 32. Call Site BindersBinder >> bindFor: aReceiver arguments: anArray^BindingRule for: (aReceiver compiledMethodAt: #show).
  33. 33. Call Site BindersBinder >> bindFor: aReceiver arguments: anArray^aReceiver bindEvaluateFor: self arguments: anArray.
  34. 34. Call Site BindersObject >> bindEvaluateFor: aBinder arguments: anArray^BindingRule for: (self compiledMethodAt: aBinder selector). ” or return whatever it wants! ”
  35. 35. Call Site Binders … receiver can’t help us, then …fallbackBindInvokeFor: aReceiver arguments: anArray^BindingRule for: … some compiled method …
  36. 36. Expression Trees
  37. 37. Expression TreesAbstract Semantic Tree
  38. 38. Expression TreesAbstract Semantic TreeAbstract Syntax Tree
  39. 39. Expression TreesAbstract Semantic TreeAbstract Syntax TreeExpression trees model code
  40. 40. Expression TreesAbstract Semantic TreeAbstract Syntax TreeExpression trees model codeExpressions are used torepresent the implementationof certain code or logic
  41. 41. Expression TreessignString ^self < 0 ifTrue: [ Negative ] ifFalse: [ Positive ].
  42. 42. Expression TreessignString^Expression condition: (Expression lowerThan: self value: 0) true: Negative false: Positive.
  43. 43. Expression TreessignStringselfArg := Expression parameter: self.^Expression condition: (Expression lowerThan: selfArg value: (Expression constant: 0)) true: (Expression constant: Negative) false: (Expression constant: Positive).
  44. 44. Expression TreesTranscriptStream>>show: anObjectself nextPutAll: anObject.
  45. 45. Expression Treesself nextPutAll: anObject.selfArg := Expression parameter: self.arg1 := Expression parameter: anObject.^Expression dynamic: (Binder selector: #nextPutAll:) receiver: selfArg arguments: (Array with: arg1).
  46. 46. Expression TreesBinder >> bindFor: aReceiver arguments: anArray^BindingRule for: (aReceiver compiledMethodAt: #nextPutAll).
  47. 47. Expression TreesBinder >> bindFor: aReceiver arguments: anArray^BindingRule expression: (Expression dynamic: (Binder selector: #nextPutAll:) receiver: aReceiver expression arguments: (Array with: anArray first expression).
  48. 48. Code Pipeline
  49. 49. Code PipelineSmalltalk Sources
  50. 50. Code PipelineSmalltalk Sources Smalltalk AST Smalltalk Parser
  51. 51. Code PipelineSmalltalk Sources Smalltalk Expression AST Tree Smalltalk JIT- Smalltalk Parser Compiler
  52. 52. Code PipelineSmalltalk Sources Smalltalk Expression MSIL AST Tree (Bytecode) Smalltalk JIT- DLR / Linq Smalltalk Parser Compiler Compiler
  53. 53. Code PipelineSmalltalk Sources Smalltalk Expression MSIL Machine Code AST Tree (Bytecode) Smalltalk JIT- DLR / Linq .NET CLR Smalltalk Parser Compiler Compiler (JIT Compiler)
  54. 54. PolymorphicInline Caching
  55. 55. CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder: (Binder selector: #show:).call1 evaluateWithReceiver: Transcript andArgs: #(Hello, Edinburgh).
  56. 56. CachingBinder >> bindFor: aReceiver arguments: anArraymethod := aReceiver value compiledMethodAt: #show:.” … magic … to generate expression from method … ”^BindingRule expression: (Expression dynamic: (Binder selector: #nextPutAll:) receiver: aReceiver expression arguments: (Array with: anArray first expression).
  57. 57. CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder: (Binder selector: #show:).call1 evaluateWithReceiver: Transcript andArgs: #(Hello, Edinburgh).
  58. 58. CachingBinder >> bindFor: aReceiver arguments: anArraymethod := aReceiver value compiledMethodAt: #show:.” … magic … to generate expression from method … ”^BindingRule expression: ” … expression … ” restriction: [ :obj | obj class = TranscriptStream ].
  59. 59. CachingTranscript show: Hello, Edinburgh!.call1 := CallSite onBinder: (Binder selector: #show:).call1 evaluateWithReceiver: Transcript andArgs: #(Hello, Edinburgh).
  60. 60. Restrictions• Restrictions can be more complex • For example, instance specific or object version specific• Restrictions determine the polymorphism of objects• Restrictions are the key to polymorphic inline caching!
  61. 61. The Cache• 3 Levels of Caching:• Level 0 : Rule for last call• Level 1 : Last 10 rules• Level 2 : 100 rules, shares across similar call sites
  62. 62. .NET DLR
  63. 63. Common Vocabulary• None Defined• De-Facto, the .Net class library• We aim at reusing the common classes – Example: System.Char => Character• Not everything maps easily, but most do – Example: System.String ~= String
  64. 64. Demo
  65. 65. Summary
  66. 66. Components Hosting Interchange InstallerIC Encoder AST JIT Compiler DefinitionInstaller Runtime Compiler Core IC JitCompiler Common
  67. 67. HostingWindows Process .Net AppDomain .Net AppDomain DLR Script Scope Smalltalk Runtime Smalltalk (Runtime) Smalltalk Runtime Ruby / Python Smalltalk Runtime DLR Script Scope
  68. 68. SpecificsSymbolsStringsSmalltalk Process#sender#respondsTo:Events
  69. 69. Object SpaceNo Object Space ReflectionNo #allInstancesNo #allReferencesNo #become:But #behaveLike: is possible!Debugger inspection is possible.
  70. 70. Major Tech Companies
  71. 71. Good NewsUnicodeMulti ThreadedLarge Class LibraryWeb-HostableMIT License
  72. 72. Near FutureGenericsClass Library Importer (or auto-integration)Finish Version 1.0Write Tests (…)
  73. 73. FutureGUI Integration (WinForms + WPF)SubSystems(Interactive) DebuggerVisual Studio IntegrationMixinsSubSystems / NamespacesInstance Specific Behavior
  74. 74. Questionshttp://ironsmalltalk.codeplex.com/ mailto:todor@scientia.dk
  75. 75. Callbacks List showItems: #( TT ST ).Workspace >> evaluateSmalltalk >> run
  76. 76. Callbacks List >> showItems: anArray “ AddItems(anArray, self) ” <Windows API>List >> showItems:Workspace >> evaluateSmalltalk >> run
  77. 77. Callbacks List.AddItems(string[] keys, dynamic stList) { for(i=0; i<…;i++) this.AddItem( keys[i],List.AddItems() stList);List >> showItems: }Workspace >> evaluateSmalltalk >> run
  78. 78. Callbacks List.AddItem(string[] keys, dynamic stList) { string text = stList. .GetItemText(key);List.AddItem()List.AddItems() ” …somehow add it… ”List >> showItems: }Workspace >> evaluateSmalltalk >> run
  79. 79. Callbacks List >> getItemText: aString ^self itemTextsList >> getItemText: at: aString.List.AddItem()List.AddItems()List >> showItems:Workspace >> evaluateSmalltalk >> run
  80. 80. Callbacks .Net 4.0 has the dynamic keyword used for invoking method on dynamic objects.List >> getItemText: IronSmalltalk objects canList.AddItem() transparently be used by any DLR aware language.List.AddItems()List >> showItems:Workspace >> evaluateSmalltalk >> run
  81. 81. Callbacks Native Name: GetItemText List >> getItemText: aStringList >> getItemText:List.AddItem()List.AddItems() The native name is theList >> showItems: method name (selector) thatWorkspace >> evaluate is exposed to the other DLR languages.Smalltalk >> run
  82. 82. Exceptions [ Transcript show: Hello, Edinburgh! ] on: Error do: [ … ].Workspace >> evaluateSmalltalk >> run
  83. 83. Exceptions BlockClosure >> on: exception do: handlerAction ” Some magic … ”BlockClosure >> on:do: ^self value.Workspace >> evaluateSmalltalk >> run
  84. 84. Exceptions BlockClosure >> value < Primitive >BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  85. 85. Exceptions TranscriptStream >> show: anObject self nextPutAll:TranscriptStream >> show: anObject asString;BlockClosure >> value endEntry.BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  86. 86. Exceptions String >> asString ^self.String >> asStringTranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  87. 87. Exceptions TranscriptStream >> show: anObject self nextPutAll:TranscriptStream >> show: anObject asString;BlockClosure >> value endEntry.BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  88. 88. Exceptions TranscriptStream >> nextPutAll: aString ” … some code here … ”TranscriptStream >>nextPutAll:TranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  89. 89. Exceptions TranscriptStream >> show: anObject self nextPutAll:TranscriptStream >> show: anObject asString;BlockClosure >> value endEntry.BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  90. 90. Exceptions TranscriptStream >> endEntry ” … some code here … ”TranscriptStream >> endEntryTranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  91. 91. Exceptions TranscriptStream >> show: anObject self nextPutAll:TranscriptStream >> show: anObject asString;BlockClosure >> value endEntry.BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  92. 92. Exceptions BlockClosure >> value < Primitive >BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  93. 93. Exceptions BlockClosure >> on: exception do: handlerAction ” Some magic … ”BlockClosure >> on:do: ^self value.Workspace >> evaluateSmalltalk >> run
  94. 94. Exceptions Transcript show: Hello, Edinburgh!.Workspace >> evaluateSmalltalk >> run
  95. 95. Exceptions TranscriptStream >> nextPutAll: aString ” Transcript Window cannotTranscriptStream >>nextPutAll: hold more text! ”TranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  96. 96. Exceptions TranscriptStream >> nextPutAll: aString ” Transcript Window cannotTranscriptStream >>nextPutAll: hold more text! ”TranscriptStream >> show:BlockClosure >> value FAIL !BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  97. 97. Exceptions .Net Exceptions unwind the stackTranscriptStream >>nextPutAll: when thrown!TranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  98. 98. Exceptions Smalltalk expects resumableTranscriptStream >>nextPutAll: exceptions!TranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do: Stack is gone!Workspace >> evaluateSmalltalk >> run
  99. 99. Exceptions Must keep stack!Extra code here …BlockClosure >> valueTranscriptStream >>nextPutAll: Code executes asTranscriptStream >> show:BlockClosure >> value usually.BlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  100. 100. Exceptions Unwinding is executes asTranscriptStream >>nextPutAll: usually.TranscriptStream >> show:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  101. 101. Exceptions List >> getItemText: aStringList >> getItemText:List.AddItem() ^self itemTextsList.AddItems() at: aString.List >> showItems:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  102. 102. Exceptions List >> getItemText: aStringList >> getItemText:List.AddItem() ^self itemTextsList.AddItems() at: aString.List >> showItems:BlockClosure >> valueBlockClosure >> on:do: KEY IS MISSINGWorkspace >> evaluateSmalltalk >> run
  103. 103. Exceptions List >> getItemText: aStringList >> getItemText:List.AddItem() ^self itemTextsList.AddItems() at: aString.List >> showItems:BlockClosure >> valueBlockClosure >> on:do: KEY IS MISSINGWorkspace >> evaluateSmalltalk >> run
  104. 104. Exceptions List >> getItemText: aStringList >> getItemText:List.AddItem() ^self itemTextsList.AddItems() at: aString.List >> showItems:BlockClosure >> valueBlockClosure >> on:do: KEY IS MISSINGWorkspace >> evaluateSmalltalk >> run
  105. 105. ExceptionsList >> getItemText: Exceptions mustList.AddItem() integrate with thetry { … } catch { … } rest of the .Net!List.AddItems()List >> showItems:BlockClosure >> valueBlockClosure >> on:do:Workspace >> evaluateSmalltalk >> run
  106. 106. ExceptionsNon-Resumable exceptions can bemapped to native .Net exceptions
  107. 107. ExceptionsNon-Resumable exceptions can bemapped to native .Net exceptionsResumable exceptions cannot bemapped to native .Net exceptionsand will need a IronSmalltalkspecial implementation.

×