在OCaml自定义顶级中设置提示

在OCaml自定义顶级中设置提示,ocaml,Ocaml,在OCaml自定义顶级中,是否有方法通过编程将提示从#设置为其他内容?我希望能够更改它以响应用户的最后一个自定义函数(类似于bash如何设置PS1)。我甚至找不到改变它的指令。谢谢 在toplevel/toploop.ml中: let prompt = if !Clflags.noprompt then "" else if !first_line then "# " else if Lexer.in_comment () then "* " else " " in 但是等等

在OCaml自定义顶级中,是否有方法通过编程将提示从
#
设置为其他内容?我希望能够更改它以响应用户的最后一个自定义函数(类似于
bash
如何设置
PS1
)。我甚至找不到改变它的指令。谢谢

在toplevel/toploop.ml中:

let prompt =
  if !Clflags.noprompt then ""
  else if !first_line then "# "
  else if Lexer.in_comment () then "* "
  else "  "
in
但是等等!计算的提示被传递到
!读取交互式输入,
并导出此引用:

在toplevel/toploop.mli中:

(* Hooks for external line editor *)

val read_interactive_input : (string -> string -> int -> int * bool) ref
因此,您似乎只需将
Toploop.read\u interactive\u input
的值从默认值更改为忽略传递的提示并打印所需提示的函数

read\u interactive\u 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)
让读取\u输入\u默认提示缓冲区len=
输出字符串pervisives.stdout提示符;冲洗渗透液;
设i=ref0 in
尝试
尽管如此
如果!i>=len,然后升起出口;
设c=输入_char perversives.stdin in
缓冲区。[!i]
(!我,没错)
|退出->
(!我,错)
因此,您可以使用:

# 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 = ()
%%%
#让我的_读取_输入提示缓冲区len=
输出字符串Pervasives.stdout“%%”;冲洗渗透液;
设i=ref0 in
尝试
尽管如此
如果!i>=len,然后升起出口;
设c=输入_char perversives.stdin in
缓冲区。[!i]
(!我,没错)
|退出->
(!我,错)
;;
val my_read_输入:“a->string->int->int*bool=
#Toploop.read_interactive_input:=my_read_input;;
-:单位=()
%%%

BTW就是它的用途。或者,更短,更“可链接”:
Toploop.read\u interactive\u input:=let old=!Toploop.read_interactive_输入乐趣提示缓冲区len->old“%%%”缓冲区len