COSE212-22F 강의의 학생들이 확장한 Revise 언어(Revise v5)입니다. 기본 Revise 언어는 [여기]에서 확인할 수 있습니다.
Revise 프로그램 P
는 작은 수정을 정의한 언어로 명령의 리스트로 이루어져 있습니다.
P = I*
I = C | C N
C = ^ | v | < | >
| origin
| backspace
| insert(S)
N = positibe integer (* i.e., 1, 2, ... *)
S = raise UndefinedSemantics
| ;
| V
| " " // 공백 문자로 큰 따옴표 없이 입력해야 합니다. e.g.) insert( )
| (
| \) // insert의 )와 구분하기 위한 \가 필요합니다. 입력은 )만 입력됩니다. e.g.) insert(\))
| raise TypeError
| __entry__ // 진입점 함수의 이름(e.g., min)이 삽입됩니다.
// 진입점 함수의 이름 또는 __entry__ 중 어느 것을 사용하여도 삽입되는 문자열은 같습니다.
// 예를 들어, 진입점 함수가 min일 경우 아래 두 insert는 모두 min을 삽입합니다:
// insert(__entry__)
// insert(min)
V = __ | _V // 2개 이상의 _의 나열
C N
:C
커맨드를N
번 반복합니다.^
,v
,<
,>
: 각각 상하좌우 방향으로 커서를 움직이는 것을 의미합니다.origin
: 커서를 맨 위, 맨 왼쪽으로 이동시킵니다.backspace
: 커서 위치에서 한 글자 지웁니다.insert(S)
: 커서 위치에S
를 삽입합니다.
fact.ml
의 중간의;;;
중;
하나 지우기
오류 코드
(* fact.ml *)
let rec fact : int -> int
= fun n -> if n > 1 then 1 else n * fact (n - 1);;;
fact 10;;
Revise
revise -verbose -target examples/fact.ml "vv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>backspace"
수정된 코드
(* fact.ml *)
let rec fact : int -> int
= fun n -> if n > 1 then 1 else n * fact (n - 1);;
fact 10;;
add.ml
에;;
삽입
오류 코드
(* add.ml *)
let rec map : ('a -> 'b) -> 'a list -> 'b list
= fun f l ->
match l with
| [] -> []
| hd::tl -> (f hd)::(map f tl)
let add : int list -> int -> int list
= fun l a -> map (fun e -> e + a) l
add [1; 2; 3] 1
add [2; 4; 6] 2
Revise
revise -verbose -target examples/add.ml "vvvvvvvv >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> insert(;)insert(;) origin vvvvvvvvvv >>>>>>>>>>>>>>> insert(;)insert(;) origin vvvvvvvvvvv >>>>>>>>>>>>>>> insert(;)insert(;)"
수정된 코드
(* add.ml *)
let rec map : ('a -> 'b) -> 'a list -> 'b list
= fun f l ->
match l with
| [] -> []
| hd::tl -> (f hd)::(map f tl)
let add : int list -> int -> int list
= fun l a -> map (fun e -> e + a) l;;
add [1; 2; 3] 1;;
add [2; 4; 6] 2;;
diff.ml
의 진입점 함수diff
에 발생한 오타 수정
오류 코드
(* diff.ml *)
let dif : int -> int -> int
= fun a b -> if a > b then a - b else b - a
Revise
revise -verbose -entry diff -target examples/diff.ml "v>7backspace3insert(diff)"
수정된 코드
(* diff.ml *)
let diff : int -> int -> int
= fun a b -> if a > b then a - b else b - a
Revise는 아래 두 프로그램을 이용하여 빌드합니다.
git clone https://github.com/kupl/revise-22f.git
cd revise-22f
opam pin add --yes revise https://github.com/kupl/revise-lang.git#v1.0
dune build
dune install
# your command: revise ...