Как Common Lisp представляет модификаторы управления для символьных клавиш?

Согласно CLTL2, все функции, связанные с модификаторами клавиш, похоже, удалены из стандарта. У SBCL, похоже, ничего из этого нет.

Каково печатное представление символов с модификаторами и как указать их в символьной нотации, если такая нотация есть в Common Lisp?

Другими словами, есть ли в Common Lisp нотация для чтения символов и последовательностей символов с модификаторами, аналогичными тем, что они делают в Emacs: ?\C-q (Ctrl-q) или ?\M-\S-o (Alt-Shift-o).

Целесообразно ли реализовать что-то в виде тех функций, которые удалены из стандарта, если хотелось бы реализовать свои, или есть что-то более широко используемое? В качестве побочного вопроса: известно, почему эти функции удалены из стандарта?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В описании проблемы в HyperSpec говорится только:

Более ранние версии Common LISP включали FONT и BITS в качестве атрибутов символьных объектов. Эти и другие поддерживаемые атрибуты считаются атрибутами, определяемыми реализацией, и, если они поддерживаются реализацией, влияют на действие выбранных функций.

В любом случае Стандарт не запрещает реализациям делать что-то вроде этого:

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

Не существует стандартного печатного представления символов с модификаторами, поскольку реализации Common Lisp не обязаны поддерживать эти «символы».

Вероятно, лучше вообще не думать о них как о символах, а как о нажатиях клавиш. Обычно нажатие клавиши с модификаторами предназначено для того, чтобы сигнализировать о чем-то, а не для создания символа. Обычный способ справиться с этим — перевести терминал или консоль в необработанный режим, чтобы программа не ждала, пока пользователь нажмет Enter, прежде чем сможет получить ввод. Для этого требуется взаимодействие со средой, что вы можете сделать из C, манипулируя структурой termios в Linux. Вот руководство о том, как заставить это работать.

Вы можете взаимодействовать с кодом C, чтобы сделать это из Lisp. SBCL имеет несколько расширений Posix, которые позволяют вам манипулировать структурами termios, чтобы вам не приходилось проходить через C. Или вы можете использовать библиотеку, которая сделает это за вас, например, вы можете использовать tribuy-raw-io или нажатие клавиши терминала.

Да, я именно это имел в виду, извините за неправильную ссылку. К сожалению, стандартного представления не существует. Я знаком с сырыми/приготовленными режимами и различными способами ввода данных. К сожалению, termios непереносится на некоторые ОС, как и ни одна из этих библиотек. Я могу приготовить самостоятельно или пройти через pdcurses на низком уровне, но проблема в том, как представлять в приложении символы с модификаторами. Это почти требует использования моего собственного типа символов и преобразования между типами символов реализации. Падает немного громоздко. Спасибо за вклад! :) Вы подтвердили мои опасения.

myname 14.07.2024 15:39

Я надеялся, что SBCL поддерживает sb-posix:tcgetattr в Windows с помощью некоторых хакерских действий, но я только что проверил исходный код, и это не так. Что касается представления символов с модификаторами: terminal-keypress использует структуру CL для представления нажатий клавиш с логическими полями для модификаторов Ctrl и Alt.

ad absurdum 14.07.2024 16:07

Я не знаю насчет cygwin, но я примерно на 99% уверен, что msys2 не поддерживает tcgetattr. Я уже использовал консольный API Win32, низкий уровень для чтения и управления стандартным вводом/выводом не является самой большой проблемой. Моя большая проблема заключается в том, должен ли я преобразовать символы в целые числа и замаскировать себя для элементов управления, или лучше использовать список или defstruct. В любом случае, похоже, мне придется самостоятельно управлять персонажем, что требует некоторых накладных расходов, но тогда я думаю, что все равно буду использовать какую-нибудь собственную очередь событий. Тогда я пропускаю командный цикл SBCL. Честно говоря, мне до сих пор немного неясно, как все устроено.

myname 14.07.2024 17:07

Другие вопросы по теме