Установка приглашения в пользовательском верхнем уровне OCaml - PullRequest
6 голосов
/ 28 мая 2011

В пользовательском верхнем уровне OCaml есть способ программно установить приглашение из # в другое значение?Я хотел бы иметь возможность изменить его в ответ на последнюю пользовательскую функцию пользователя (как в bash, как вы можете установить PS1).Я даже не могу найти директиву, чтобы изменить это.Спасибо!

1 Ответ

9 голосов
/ 28 мая 2011

На верхнем уровне / toploop.ml:

let prompt =
  if !Clflags.noprompt then ""
  else if !first_line then "# "
  else if Lexer.in_comment () then "* "
  else "  "
in

Но подождите!Вычисленное приглашение передается в !read_interactive_input, и эта ссылка экспортируется:

В toplevel / toploop.mli:

(* Hooks for external line editor *)

val read_interactive_input : (string -> string -> int -> int * bool) ref

Таким образом, все, что вам нужно сделать, это изменитьзначение Toploop.read_interactive_input от его значения по умолчанию до функции, которая игнорирует переданное приглашение и печатает желаемое вместо него.

Значение по умолчанию для read_interactive_input:

let read_input_default prompt buffer len =
  output_string Pervasives.stdout prompt; flush Pervasives.stdout;
  let i = ref 0 in
  try
    while true do
      if !i >= len then raise Exit;
      let c = input_char Pervasives.stdin in
      buffer.[!i] <- c;
      incr i;
      if c = '\n' then raise Exit;
    done;
    (!i, false)
  with
  | End_of_file ->
      (!i, true)
  | Exit ->
      (!i, false)

ТакВы можете использовать:

# let my_read_input prompt buffer len =
  output_string Pervasives.stdout  "%%%" ; flush Pervasives.stdout;
  let i = ref 0 in
  try
    while true do
      if !i >= len then raise Exit;
      let c = input_char Pervasives.stdin in
      buffer.[!i] <- c;
      incr i;
      if c = '\n' then raise Exit;
    done;
    (!i, false)
  with
  | End_of_file ->
      (!i, true)
  | Exit ->
      (!i, false)
                                  ;;
val my_read_input : 'a -> string -> int -> int * bool = <fun>
# Toploop.read_interactive_input := my_read_input ;;
- : unit = ()
%%%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...