Существует два типа префиксных операторов: операторы с префиксом тильды и операторы с префиксом взрыва. Операторы с префиксом тильды начинаются с тильды «~», а операторы с префиксом взрыва начинаются с «!». Основное различие заключается в том, что при использовании оператора с префиксом тильды вы не используете символ тильды.
Операторы с префиксом тильды
Оператор с префиксом тильды начинается с тильды "~", за которой следует один из них:
+, -, +., -.,%, %%, &, &&
Оператор с префиксом тильды также может быть построен в виде списка любого количества тильд:
~~, ~~~, ~~~~, ~~~~~, ...
Когда вы применяете оператор, вы должны опускать тильду, если только это не змея тильды.
╔═════════════╦════════════╦══════════════════════════╗
║ declaration ║ usage ║ remark ║
╠═════════════╬════════════╬══════════════════════════╣
║ ~~ ║ ~~ ║ ║
║ ~~~ ║ ~~~ ║ ║
║ ~~~~~~~~~ ║ ~~~~~~~~~ ║ or any number of tildes ║
║ ~+ ║ + ║ ║
║ ~+. ║ +. ║ ║
║ ~- ║ - ║ ║
║ ~-. ║ -. ║ ║
║ ~% ║ % ║ ║
║ ~%% ║ %% ║ ║
║ ~& ║ & ║ ║
║ ~&& ║ && ║ ║
╚═════════════╩════════════╩══════════════════════════╝
Операторы с префиксом
Оператор с префиксом взрыва начинается с взрыва "!" сопровождаемый любой комбинацией этих символов:
!,%, &, *, +,., /, <, =,>, @, ^, |, ~,?
Исключением из этого правила является "! =". Префиксный оператор не должен начинаться с этой комбинации.
В этой таблице приведены некоторые примеры.
╔══════════════╦══════════════╗
║ declaration ║ usage ║
╠══════════════╬══════════════╣
║ !! ║ !! ║
║ !% ║ !% ║
║ !& ║ !& ║
║ !* ║ !* ║
║ !+ ║ !+ ║
║ !. ║ !. ║
║ !/ ║ !/ ║
║ !< ║ !< ║
║ !> ║ !> ║
║ !@ ║ !@ ║
║ !^ ║ !^ ║
║ !| ║ !| ║
║ !~ ║ !~ ║
║ !? ║ !? ║
║ !@=@> ║ !@=@> ║
║ !!!/<=>@!!!* ║ !!!/<=>@!!!* ║
╚══════════════╩══════════════╝
Фрагменты кода с префиксом тильды
type SomeString = SomeString of string
let ( ~~ ) (SomeString s) = "~~ " + s
let ( ~~~ ) (SomeString s) = "~~~ " + s
let ( ~~~~~~~~~ ) (SomeString s) = "~~~~~~~~~ " + s
let ( ~+ ) (SomeString s) = "~+ " + s
let ( ~+. ) (SomeString s) = "~+. " + s
let ( ~- ) (SomeString s) = "~- " + s
let ( ~-. ) (SomeString s) = "~-. " + s
let ( ~% ) (SomeString s) = "~% " + s
let ( ~%% ) (SomeString s) = "~%% " + s
let ( ~& ) (SomeString s) = "~& " + s
let ( ~&& ) (SomeString s) = "~&& " + s
let x = SomeString "tilde"
printf "%s\n" (~~ x) // ~~ tilde
printf "%s\n" (~~~ x) // ~~~ tilde
printf "%s\n" (~~~~~~~~~ x) // ~~~~~~~~~ tilde
printf "%s\n" (+ x) // ~+ tilde
printf "%s\n" (+. x) // ~+. tilde
printf "%s\n" (- x) // ~- tilde
printf "%s\n" (-. x) // ~-. tilde
printf "%s\n" (% x) // ~% tilde
printf "%s\n" (%% x) // ~%% tilde
printf "%s\n" (& x) // ~& tilde
printf "%s\n" (&& x) // ~&& tilde
Операторы с префиксом фрагмента кода
type SomeString = SomeString of string
let ( !! ) (SomeString s) = "!! " + s
let ( !% ) (SomeString s) = "!% " + s
let ( !& ) (SomeString s) = "!& " + s
let ( !* ) (SomeString s) = "!* " + s
let ( !+ ) (SomeString s) = "!+ " + s
let ( !. ) (SomeString s) = "!. " + s
let ( !/ ) (SomeString s) = "!/ " + s
let ( !< ) (SomeString s) = "!< " + s
let ( !> ) (SomeString s) = "!> " + s
let ( !@ ) (SomeString s) = "!@ " + s
let ( !^ ) (SomeString s) = "!^ " + s
let ( !| ) (SomeString s) = "!| " + s
let ( !~ ) (SomeString s) = "!~ " + s
let ( !? ) (SomeString s) = "!? " + s
let ( !@=@> ) (SomeString s) = "@=@> " + s
let ( !!!/<=>@!!!* ) (SomeString s) = "!!!/<=>@!!!* " + s
//let ( != ) (SomeString s) = "!= " + s // prefix != is not allowed
//let ( !=@@ ) (SomeString s) = "!= " + s // prefix != is not allowed
let y = SomeString "bang"
printf "%s\n" (!! y) // !! bang
printf "%s\n" (!% y) // !% bang
printf "%s\n" (!& y) // !& bang
printf "%s\n" (!* y) // !* bang
printf "%s\n" (!+ y) // !+ bang
printf "%s\n" (!. y) // !. bang
printf "%s\n" (!/ y) // !/ bang
printf "%s\n" (!< y) // !< bang
printf "%s\n" (!> y) // !> bang
printf "%s\n" (!@ y) // !@ bang
printf "%s\n" (!^ y) // !^ bang
printf "%s\n" (!| y) // !| bang
printf "%s\n" (!~ y) // !~ bang
printf "%s\n" (!? y) // !? bang
printf "%s\n" (!@=@> y) // !@=@> bang
printf "%s\n" (!!!/<=>@!!!* y) // !!!/<=>@!!!* bang