Smalltalk (Pharo) Как просто взаимодействовать с пользователем - PullRequest
0 голосов
/ 05 декабря 2018

Я наткнулся на Smalltalk и далее скачал Pharo, потому что это было рекомендовано.Мое первое впечатление очень позитивное.Я хотел портировать несколько простых программ, написанных на C ++ (мой основной язык), чтобы я смог почувствовать Smalltalk.

Однако я понял, что не могу найти простой способ просто получить некоторую информациюот пользователя, например, я хочу создать консольный калькулятор с циклом REPL, но я не могу найти способ сделать это в Pharo.Я не хочу графический интерфейс с кнопками, потому что это просто медленно и неудобно.

Может кто-нибудь подскажет мне, как делать простые вещи в Smalltalk, например, чтобы пользователь вводил 10 цифр или команду и т.д..?Должен ли я использовать другую реализацию?Я нацеливаюсь на std :: cin / cout или print / input Python

Я знаю Transcript show:, но он охватывает только часть вывода.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

Получение информации от пользователя легко, но эмуляция линейной консоли не так уж и велика.По крайней мере, это было бы более громоздко, чем полагаться на графический интерфейс, который на самом деле не такой медленный и неудобный.

Ближайший входной эквивалент, эквивалентный Transcript show:, будет:

UIManager default request: 'Title of the request'

Если вы отметите этот фрагмент и «напечатаете его» или «осмотрите его», вы увидите диалоговое окно с подсказкой и сможете ввести в него что-нибудь.Когда вы принимаете диалог с помощью OK или возврата, вы получите введенную строку в качестве возвращаемого значения request:.

Получение десяти чисел может быть сделано следующим образом:

(1 to: 10) collect: [:each | (UIManager default request: 'Enter number ', each asString) asNumber ]

Результатом будет массив введенных чисел.

Или без использования collect: и самостоятельного создания коллекции:

numbers := OrderedCollection new.
10 timesRepeat:
    [ numbers add: (UIManager default request: 'Enter next number') asNumber ].
numbers do: [:each | Transcript show: each ].

Вам также может понравиться UIManager default chooseFrom:.Просмотрите класс UIManager и попробуйте различные методы.


Обратите внимание, что игровая площадка Pharo (называемая рабочей областью в большинстве других Smalltalks) уже делает то, что делает REPL, хотя она не ограничивается вводом на основе строк.Вы можете набирать выражения Smalltalk, оценивать их и распечатывать результаты там.Мне известно, что эта информация не дает вам опыта переноса приложения калькулятора из C ++.Но я предполагаю, что то, как работает ввод-вывод или, скорее, взаимодействие с пользователем, не является сущностью программ, которые вы пытаетесь портировать, верно?Таким образом, вы могли бы также написать класс Calculator, в котором вы реализуете свое приложение калькулятора, беря строку в качестве входных данных и возвращая полученное число, а затем вызываете его из игровой площадки, вычисляя выражение, подобное следующему:

Calculator new calculate: '3 + 4'

Если вы действительно, действительно хотите придерживаться консольного материала и упустить преимущества обычной среды разработки Smalltalk и опыта изучения и использования, вам может быть лучше с GNU Smalltalk.Я думаю, что есть способы создания консольных приложений с помощью Pharo, но я бы не советовал это новичкам в Smalltalk, и я оставлю этот ответ кому-то, кто уже сделал это однажды.

...