2013-06-22 3 views
2
Transcript show: 'Derp'. 

printSomething: 'Derpy'. 

"The method above produced this error:" 
"prog.st:3: expected expression" 

printSomething: what 
    10 timesRepeat: [ 
     Transcript show:what. 
     Transcript cr. 
    ]. 

Сейчас я пытаюсь научить себя Smalltalk, и я до сих пор не понял, как назвать функцию, которую я написал. Я попытался вызвать функцию printSomething с параметром 'Derpy' с помощью оператора printSomething: 'Derpy'., но вместо вызова функции он произвел следующую ошибку: prog.st:3: expected expression.Каков правильный способ определения и вызова функций в GNU Smalltalk?

Что я здесь делаю неправильно, и каков правильный способ вызова функций с параметрами в Smalltalk? Ни один из обучающих программ, которые я прочитал, до сих пор не ответил на мой вопрос, и я все еще немного смущен.

+0

У вас есть ошибка капитализации в вашем коде. Имя метода имеет капитал P, но вы пытаетесь называть его строчным p. – fzwo

+0

@fzwo Тем не менее, та же ошибка возникает, даже если ошибка капитализации была исправлена. Я до сих пор не понял правильный синтаксис для вызовов функций Smalltalk. –

+0

В следующий раз добавьте тег, в котором указывается, какой Smalltalk вы используете. GNU Smalltalk и Squeak/Pharo работают по-разному с точки зрения того, как они обрабатывают исходный код. –

ответ

2

Я подозреваю, что ваши ошибки двоякой:

Object class: #Example [ 
    instanceVariableNames: '' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'Smalltalk Examples' 
] 

Example class extend [ 
    printSomething: what 
     10 timesRepeat: [ 
      Transcript show:what. 
     ] 
] 

Eval [ 
    Transcript show: 'Derp'. 
    (Example new) printSomething: 'Derpy'. 
] 

Обратите внимание на Eval [] блок, и что вы создаете экземпляр Example, не NameOfSubclass.

+0

Какие диалекты Smalltalk относятся к этому вопросу? –

+0

GNU Smalltalk, который соответствует синтаксису кода, к которому привязан OP. –

1

В каком классе вы определили метод? Вы не указываете, к какому классу вы отправляете сообщение (говоря ему, чтобы выполнить метод).

В случае Transcript show: 'Derp'., вы отправляете сообщение для глобальной переменной Transcript (экземпляр класса Stream), и show: является методом класса реализован на Transcript или одного из его суперкласса.

Если метод определен в том же классе, что вы отсылается, self это ключевое слово, чтобы использовать, так что было бы self printSomething: 'Derpy'.

+0

Я не определял метод в классе: необходимо ли, чтобы все методы в Smalltalk определялись внутри класса? –

+0

Тогда где/как вы это определили? Я немного ржавый, и в разных средах Smalltalk некоторые вещи (например, определение материала в рабочей области) по-разному, но, как правило, Smalltalk очень объектно-ориентирован. – fzwo

+0

Я определил метод здесь: http://ideone.com/Ln7eCn –

2

Smalltalk является чисто объектно-ориентированным языком. Вы можете отправлять сообщения только объектам, которые вызывают метод, определенный в их классе.

На каком классе вы определили printSomething? Если вы определили его как метод экземпляра, вам нужно вызвать его в экземпляре этого класса. Например:

MyClass new printSomething: 'Derpy' 

Если вы определили его как метод класса, вы можете отправить его непосредственно самому классу.

+0

Возможно, посетите Pharo Smalltalk и отличную онлайн-книгу: www.pharo-project.org. Это может помочь вам больше, особенно для обучения Smalltalk в целом. –

2

При попытке изучить smalltalk используйте небольшую среду. Не используйте интерфейс командной строки, не используйте он-лайн веб-инструмент. Оба они очень полезны, но не изучают smalltalk. Они не предоставляют обратную связь, необходимую вам для того, чтобы узнать, как быстро и быстро вывести smalltalk. Если это не позволяет вам писать большую часть вашего кода в отладчике, вы не будете изучать smalltalk.

Книга и окружающая среда, разработанные для изучения smalltalk, это Pharo By Example. Используйте изображение и vm оттуда. Pharo развивается быстро, использование более новой версии будет путать.

+0

Для GNU Smalltalk интерфейс командной строки _is_ a Smalltalk! (Это REPL.) –

+0

Да. Поэтому не используйте это для * learn * smalltalk. Я также не рекомендую топаз изучать smalltalk. Или Amber (пока что отладчик ожидается в любое время). –

1

В gnu-smalltalk 3.2.5.

Object subclass: Example [ 
    printSomething: what 
    [ 
     10 timesRepeat: [ 
      Transcript show:what. 
     ] 
    ] 
] 

Eval [ 
    Transcript show: 'Derp'. 
    (Example new) printSomething: 'Derpy'. 
]