Ошибка синтаксического анализа Smalltalk
Я новичок в Smalltalk, и мне трудно понять, почему я получаю эту ошибку синтаксического анализа. Ошибка:
/newanimal.st:52: parse error, expected ')'
Я пытаюсь перебрать набор с именем grid, который является коллекцией словарей, и в каждом словаре я хочу сравнить значения каждой строки и столбца, чтобы увидеть, соответствуют ли они значениям, которые были переданы методу. Прямо сейчас я могу заставить его принимать только один параметр в методе, если кто-нибудь покажет мне, как передать более одного параметра, что также было бы здорово. Также я использую gnu smalltalk и gst для проверки этого. Команда, которую я запускаю, выглядит следующим образом: (FileStream open: 'newanimal.st' mode: 'r') fileIn . !
Строка 52:
(tempAnimal at: type := 'lynx') ifTrue: temp := tempAnimal at: row
Вот остальная часть кода для справки.
Object subclass: #simulation .
simulation instanceVariableNames: ' ' .
simulation class instanceVariableNames: '' .
simulation comment: 'This is the class that runs the simulation' .
simulation class extend [
initialize [
]
new [
]
setup [
]
step [
]
status [
]
rand [
|num|
num := Random new .
num := (num nextValue) * 10 .
num := num asInteger.
^ num .
]
]
simulation extend [
]
Object subclass: #grid .
grid instanceVariableNames: ' ' .
grid class instanceVariableNames: ' grida ' .
grid comment: 'I represent the grid and animal locations' .
grid class extend [
initialize [
grida := Set new .
]
new [ "Builds arrays of correct size"
(grida = nil) ifTrue: self initialize .
^ super new grida .
]
getLynxesAtRow:col ["Returns number of lynxes in a grid cell"
| tempAnimal temp count |
count := 0
grid do: [ :each |
tempAnimal := grid at: each .
(tempAnimal at: type := 'lynx') ifTrue: temp := tempAnimal at: row
(temp := row) ifTrue: temp := tempAnimal at: col
(temp := col) ifTrue: count := count + 1
].
^ count .
]
getRabbitsAtRow:col ["Returns number of rabbits in a grid cell"
| tempAnimal temp count |
count := 0
grid do: [ :each |
tempAnimal := grid at: each
(tempAnimal at: type := 'rabbit') ifTrue: temp := tempAnimal at: row
(temp := row) ifTrue: temp := tempAnimal at: col
(temp := col) ifTrue: count := count + 1 .
]
^ count .
]
placerow: animal [
| row col |
row := simulation rand .
col := simulation rand .
animal add: 'row' -> row .
animal add: 'col' -> col .
^ animal .
]
removerow: col [
| tempAnimal temp tempid |
grid do: [ :each |
tempAnimal := grid at: each
tempid := tempAnimal at: id
temp := tempAnimal at: row
(temp := row) ifTrue: temp := tempAnimal at: col
(temp := col) ifTrue: grid remove: each .
]
]
Object subclass: #animal .
animal instanceVariableNames: ' '.
animal class instanceVariableNames: ' id type animals '.
animal comment: 'I am the class for all animals' .
animal class extend [
initialize [
aniamls := Dictionary new .
]
create: type [
(animals := nil) ifTrue: self initialize
(type := 'rabbit') ifTrue: animals := rabbit new .
(type := 'lynx') ifTrue: animals := lynx new .
^ animals .
]
getid ["returns the animals unique id"
| tempAnimal temp |
tempAnimal := grid asArray at: id .
temp :=
]
getrow: id ["returns the animals grid row"
| tempAnimal temp |
grid do: [:each |
tempAnimal := grid at: each .
(tempAnimal at: id := id) ifTrue: (temp:= tempAnimal at: row. ^ temp ) . ]
]
getcol: id ["returns the animals grid col"
| tempAnimal temp |
grid do: [:each |
tempAnimal := grid at: each .
(tempAnimal at: id := id) ifTrue: (temp:= tempAnimal at: col. ^ temp ) . ]
]
getdirection: id ["returns the animals movement direction"
| tempAnimal temp |
grid do: [:each |
tempAnimal := grid at: each .
(tempAnimal at: id := id) ifTrue: (temp:= tempAnimal at: direction. ^ temp ) . ]
]
setdirection ["sets animals movement direction"
| direction |
direction := simulation rand .
^ direction .
]
]
animal subclass: #lynx
lynx instanceVariableNames: ' direction '.
lynx class instanceVariableNames: ' lynxdictionary '.
lynx comment: 'I am the subclass of animal that is lynxs' .
lynx class extend [
new [
lynxdictionary := Dictionary new .
lynxdictionary add: 'type' -> 'lynx'
direction := animal setdirection .
lynxdictionary add: 'direction' -> direction
lynxdictionary := grid placerow:lynxdictionary .
^ lynxdictionary .
]
act [
| row col tempAniaml |
]
]
animal subclass: #rabbit
rabbit instanceVariableNames: ' direction '.
rabbit class instanceVariableNames: ' rabbitdictionary '.
rabbit comment: 'I am the subclass of animal this is rabbits'.
rabbit class extend [
new [
rabbitdictionary := Dictionary new .
rabbitdictionary add: 'type' -> 'rabbit'
direction := animal setdirection
rabbitdictionary add: 'direction' -> direction
rabbitdictionary := grid place:rabbitdictionary .
^ rabbitdictionary .
]
act [
]
]
2 ответа
Я думаю, что вы хотите использовать '=' или '==' в качестве оператора сравнения, а не ':=', который является присваиванием.
Не мешало бы завершить все утверждения точкой, просто чтобы избежать путаницы со стороны парсера.
Помимо
- проверка операторов сравнения и
- периоды в конце каждого утверждения,
как упоминает Крис Геркен, вы должны
отправить блоки в ifTrue: и ifFalse:
(1 <2) ifTrue: ["сделай что-нибудь" ]
См. Руководство по GNU Smalltalk 6.6.1 Условия и принятие решений