1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-21 18:48:12 +03:00
mal/gst/core.st
Vasilij Schneidermann adb2ac7840 Implement step 4
2017-07-06 22:53:56 +02:00

60 lines
2.1 KiB
Smalltalk

FileStream fileIn: 'types.st'.
FileStream fileIn: 'printer.st'.
Object subclass: Core [
Ns := Dictionary new.
Core class >> Ns [ ^Ns ]
Core class >> coerce: block [
block value ifTrue: [ ^MALObject True ] ifFalse: [ ^MALObject False ]
]
Core class >> printedArgs: args readable: readable sep: sep [
| items |
items := args collect:
[ :arg | Printer prStr: arg printReadably: readable ].
"NOTE: {} join returns the unchanged array"
items isEmpty ifTrue: [ ^'' ] ifFalse: [ ^items join: sep ]
]
]
Core Ns at: #+ put:
[ :args | MALNumber new: args first value + args second value ].
Core Ns at: #- put:
[ :args | MALNumber new: args first value - args second value ].
Core Ns at: #* put:
[ :args | MALNumber new: args first value * args second value ].
Core Ns at: #/ put:
[ :args | MALNumber new: args first value // args second value ].
Core Ns at: #'pr-str' put:
[ :args | MALString new: (Core printedArgs: args readable: true sep: ' ') ].
Core Ns at: #str put:
[ :args | MALString new: (Core printedArgs: args readable: false sep: '') ].
Core Ns at: #prn put:
[ :args | (Core printedArgs: args readable: true sep: ' ') displayNl.
MALObject Nil ].
Core Ns at: #println put:
[ :args | (Core printedArgs: args readable: false sep: ' ') displayNl.
MALObject Nil ].
Core Ns at: #list put: [ :args | MALList new: (OrderedCollection from: args) ].
Core Ns at: #'list?' put:
[ :args | Core coerce: [ args first type = #list ] ].
Core Ns at: #'empty?' put:
[ :args | Core coerce: [ args first value isEmpty ] ].
Core Ns at: #count put:
[ :args | MALNumber new: args first value size ].
Core Ns at: #= put:
[ :args | Core coerce: [ args first = args second ] ].
Core Ns at: #< put:
[ :args | Core coerce: [ args first value < args second value ] ].
Core Ns at: #<= put:
[ :args | Core coerce: [ args first value <= args second value ] ].
Core Ns at: #> put:
[ :args | Core coerce: [ args first value > args second value ] ].
Core Ns at: #>= put:
[ :args | Core coerce: [ args first value >= args second value ] ].