Простая ошибка определения класса в smalltalk - PullRequest
3 голосов
/ 02 мая 2019

Я пытаюсь использовать smalltalk с smalltalk / x-jv branch .У меня есть следующий простой код:

Object subclass: Myclass[
    |mainval|
    init [mainval := 555]
    getmainval [^mainval]
]

gc := Myclass new.
gc init.
gc getmainval printNl.

Я пытаюсь запустить его из командной строки с помощью команды stc smalltalk / x-jv, но она не работает.Ниже приведена ошибка:

$ ./stc testsrc.st 
testsrc.st, line 1: Error: syntax error in 'class definition' near "Myclass" (char/token=286 / 0x11e) (fileIn expression)

Где проблема и как ее можно решить?Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 02 мая 2019

Редактировать - Добавление информации о stc и stx

Боюсь, вы не можете использовать код GNU Smalltalk непосредственно в Smalltalk / X (ветка -jv). Также было бы неплохо увидеть, какова ваша конечная цель в серии вопросов Smalltalk.

Для вас важно понимать, что Smalltalk был разработан для работы в IDE, если вы хотите создать приложение, вам следует использовать предоставленную IDE. Если вы хотите создать пример приложения, для Smalltalk / X есть даже руководство . Это, конечно, не означает, что вы не можете запустить скрипт из командной строки (Smalltalk / X обладает мощной оболочкой).

При этом существует пакет Smalltalk / X, подсвечивающий файл пакета для Sublime Text 3 , сделанный мной и размещенный в BitBucket. Я создал его в основном для Smalltalk и его встроенной подсветки языка Си.

Сначала вы, вероятно, используете stx исполняемый файл, а не stc. stc является сокращением для smalltalk-to-C компилятора . stc создает C-код , который затем может быть скомпилирован C-компилятором в объектный файл , который затем может быть связан с конечный исполняемый файл (вместе с другими классами smalltalk и средой выполнения).

smalltalk или stx - это средство запуска, которое может выполнять сценарии Smalltalk или открывать полноценную среду IDE. Если вы знакомы с Java, подумайте о stc с javac и smalltalk или stx с java.

Вы можете использовать предоставленный модуль запуска под названием smalltalk (сценарий bash для * nix и batch / powershell для Windows), который использует stx.com в конце, но предоставляет некоторые дополнительные функции.

Используйте smalltalk --help см. Параметры командной строки.

Сначала я начну с простого однострочного текста, который вы можете использовать:

stx.com -I --quick --eval "Transcript showCR: 'A message on stdout on Transcript'
A message on stdout on Transcript

на окнах вы, если вы используете smalltalk вы получите больше информации:

smalltalk -I --quick --eval "Transcript showCR: 'A message on stdout on Transcript'

"[INFO] PowerShell detected: ->TRUE<-.
"[INFO] The latest latest_powershell_version found: 5.1.16299.1004."
"[INFO] With the runtime being: v4.0.30319."
VERBOSE: [INFO] Manual switch detected - configuration is ignored
VERBOSE: [INFO] Executing asynchronously command: C:\prg_sdk\stx8-jv_swing\build\stx\projects\smalltalk\stx.com  -I
--quick --eval "Transcript showCR: 'A message on stdout on Transcript'"   | Out-null
VERBOSE: A message on stdout on Transcript
VERBOSE:
VERBOSE: [INFO] Exiting from PowerShell with code 0

VERBOSE: [INFO] End. Exiting correctly.

Теперь давайте перейдем к вашему вопросу сценариев

В начале лучший способ - создать класс в IDE и создать файл из него. После этого вы увидите правильную структуру файла .st.

Я создал для вас простой файл script.st (это то же самое, что вы получите в файле Out of IDE):

"{ NameSpace: Smalltalk }"

Object subclass:#MyClass
    instanceVariableNames:'mainValue'
    classVariableNames:''
    poolDictionaries:''
    category:''
!

!MyClass methodsFor:'accessing'!

mainValue

    ^ mainValue
!

mainValue: newValue

    mainValue := newValue
! !

!MyClass methodsFor:'initialization & release'!

initialize

    super initialize.
    mainValue := 555.
! !


gc := MyClass new.
gc initialize.
Transcript showCR: gc mainValue.

Как вы запускаете такой скрипт?

smalltalk --execute script.st

Вывод будет: 555

Если вы хотите писать сценарии без «объектов» (ну, в Smalltalk все является объектом, но вы здесь не определяете класс), вы можете сделать простой transcript.st:

| mainValue |

mainValue := 555.
Transcript showCR: mainValue.

снова выполните его как: smalltalk --execute transcript.st, чтобы получить идентичный результат.

...