Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file defun.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443open!Core_kernelopen!Async_kernelopen!ImportincludeDefun_intfmoduleQ=structmoduleA=structletoptional="&optional"|>Symbol.internletrest="&rest"|>Symbol.internendendmoduleT0=structtype_t=|Return:'a->'at|Map:'at*('a->'b)->'bt|Both:'at*'bt->('a*'b)t|Required:Symbol.t*'aValue.Type.t->'at|Optional:Symbol.t*'aoptionValue.Type.t->'aoptiont|Rest:Symbol.t*'aValue.Type.t->'alisttletrecsexp_of_t:typea.(a->Sexp.t)->at->Sexp.t=funsexp_of_a->function|Returna->[%message"Return"~_:(a:a)]|Map(t,_)->[%message"Map"~_:(t:_t)]|Both(t1,t2)->[%message"Both"~_:(t1:_t)~_:(t2:_t)]|Required(symbol,type_)->[%message"Required"~_:(symbol:Symbol.t)~_:(type_:aValue.Type.t)]|Optional(symbol,type_)->[%message"Optional"~_:(symbol:Symbol.t)~_:(type_:aValue.Type.t)]|Rest(symbol,type_)->[%message"Rest"~_:(symbol:Symbol.t)~_:(type_:_Value.Type.t)];;letreturnx=Returnxletmapt~f=Map(t,f)letbothtt'=Both(t,t')letapplyfx=bothfx|>map~f:(fun(f,x)->fx)letmap=`CustommapendmoduleT=structincludeT0includeApplicative.Make(T0)letrequirednametype_=Required(name|>Symbol.intern,type_)letoptionalnametype_=Optional(name|>Symbol.intern,Value.Type.nil_ortype_)letrestnametype_=Rest(name|>Symbol.intern,type_)letoptional_with_nilnametype_=map(optionalnametype_)~f:(function|None->Value.Type.of_value_exntype_Value.nil|Somex->x);;letoptional_with_defaultnamedefaulttype_=map(optionalnametype_)~f:(Option.value~default);;include(Value.Type:Value.Type.S)endincludeTmoduleOpen_on_rhs_intf=structmoduletypeS=Swithtype'at='atendincludeApplicative.Make_let_syntax(T)(Open_on_rhs_intf)(T)letapplytargs~function_~defined_at=letlen=Array.lengthargsinletpos=ref0inletconvert_argargtype_value=tryValue.Type.of_value_exntype_valuewith|exn->raise_s[%message"function got argument of wrong type"~_:(function_:Sexp.t)(defined_at:Source_code_position.t)(arg:Symbol.t)~_:(exn:exn)]inletconsume_argsymboltype_=leta=convert_argsymboltype_args.(!pos)inincrpos;ainletrecloop:typea.at->a=funt->matchtwith|Returna->a|Map(t,f)->f(loopt)|Both(t1,t2)->letx1=loopt1inletx2=loopt2inx1,x2|Required(symbol,type_)->ifInt.(>=)!poslenthenraise_s[%message"Not enough arguments. Emacs should have raised wrong-number-of-arguments."]elseconsume_argsymboltype_|Optional(symbol,type_)->ifInt.(>=)!poslenthenNoneelseconsume_argsymboltype_|Rest(symbol,type_)->letretval=Array.subargs~pos:!pos~len:(len-!pos)|>Array.map~f:(funvalue->convert_argsymboltype_value)|>Array.to_listinpos:=len;retvalinletresult=looptinletpos=!posinifInt.(<>)poslenthenraise_s[%message"Extra arguments. Emacs should have raised wrong-number-of-arguments."~used:(pos:int)(args:Value.tarray)];result;;moduleArgs=structtypet={required:Symbol.tlist;optional:Symbol.tlist;rest:Symbol.toption}letsexp_of_t{required;optional;rest}=[%sexp(List.concat[required;(ifList.is_emptyoptionalthen[]elseQ.A.optional::optional);(matchrestwith|None->[]|Somerest->[Q.A.rest;rest])]:Symbol.tlist)];;letempty={required=[];optional=[];rest=None}letadd_requiredts={twithrequired=s::t.required}letadd_optionalts={twithoptional=s::t.optional}letadd_restts=matcht.restwith|None->{twithrest=Somes}|Somerest->raise_s[%message"Multiple rest arguments"~_:([rest;s]:Symbol.tlist)];;endletget_argst=letrecloop:typea.at->_->_=funtargs->matchtwith|Return_->args|Map(t,_)->looptargs|Both(t1,t2)->loopt1(loopt2args)|Required(name,_)->Args.add_requiredargsname|Optional(name,_)->Args.add_optionalargsname|Rest(name,_)->Args.add_restargsnameinlooptArgs.empty;;moduleReturns=structtype(_,_)t=|Returns:'aValue.Type.t->('a,'a)t|Returns_deferred:'aValue.Type.t->('a,'aDeferred.t)tletsexp_of_t(typeab)__(t:(a,b)t)=matchtwith|Returnstype_->[%message"Returns"(type_:_Value.Type.t)]|Returns_deferredtype_->[%message"Returns_deferred"(type_:_Value.Type.t)];;letreturns(typeab)(sync_or_async:(a,b)Sync_or_async.t)(type_:aValue.Type.t):(a,b)t=matchsync_or_asyncwith|Sync->Returnstype_|Async->Returns_deferredtype_;;endletcall(typeab)(t:at)here~function_~args~(returns:(b,a)Returns.t)~should_profile=letshould_profile=Option.valueshould_profile~default:trueinletcontext:Sexp.tLazy.t=lazy(List(function_::(args|>Array.map~f:Value.sexp_of_t|>Array.to_list)))inletapply()=applytargs~function_~defined_at:hereinletdoit()=matchreturnswith|Returnsreturns->Value.Type.to_valuereturns(apply())|Returns_deferredreturns->Value.Private.block_on_asynchereapply~context|>Value.Type.to_valuereturnsinifshould_profilethenprofileSynccontextdoitelsedoit();;moduleInteractive=structtypet=|Argsof(unit->Value.tlistDeferred.t)|Function_nameof{prompt:string}|Ignored|No_arg|Promptofstring|Raw_prefix|Regionlettype_=Value.Type.(mapvalue~name:[%message"interactive-code"]~of_:(funvalue->ifnot(Value.is_stringvalue)then(letform=Form.of_value_exnvalueinArgs(fun()->Deferred.return(Form.Blocking.evalform|>Value.to_list_exn~f:Fn.id)))else(matchvalue|>Value.to_utf8_bytes_exnwith|"i"->Ignored|""->No_arg|"P"->Raw_prefix|"r"->Region|s->letprefixes=[("s",funprompt->Promptprompt);("a",funprompt->Function_name{prompt})]in(matchList.find_mapprefixes~f:(fun(prefix,f)->Option.map(String.chop_prefixs~prefix)~f)with|Someresult->result|None->raise_s[%sexp"Unimplemented interactive code",(s:string)])))~to_:(function|Argsf->Form.list["funcall"|>Symbol.intern|>Form.symbol;Form.quote(Function.create[%here]~args:[](function|[||]->Value.list(Value.Private.block_on_async[%here]f)|_->assertfalse)|>Function.to_value)]|>Form.to_value|Function_name{prompt}->sprintf"a%s"prompt|>Value.of_utf8_bytes|Ignored->"i"|>Value.of_utf8_bytes|No_arg->""|>Value.of_utf8_bytes|Promptprompt->sprintf"s%s"prompt|>Value.of_utf8_bytes|Raw_prefix->"P"|>Value.of_utf8_bytes|Region->"r"|>Value.of_utf8_bytes));;lett=type_letof_value_exn=Value.Type.of_value_exntype_letto_value=Value.Type.to_valuetype_endmoduleFor_testing=structletdefun_symbols=ref[]letall_defun_symbols()=!defun_symbols|>List.sort~compare:Symbol.compare_nameendletadd_to_load_historysymbolhere=Load_history.add_entryhere(Funsymbol);For_testing.defun_symbols:=symbol::!For_testing.defun_symbols;;letdefalias=Funcall.("defalias"<:Symbol.t@->Symbol.t@->nil_orstring@->returnnil);;letdefaliassymbolhere?docstring~alias_of()=add_to_load_historysymbolhere;defaliassymbolalias_of(docstring|>Option.map~f:String.strip);;letdefine_obsolete_aliasobsoletehere?docstring~alias_of~since()=defaliasobsoletehere?docstring~alias_of();Obsolete.make_function_obsoleteobsolete~current:alias_of~since;;letdefun_rawsymbolhere?docstring?interactive~args?optional_args?rest_argf=add_to_load_historysymbolhere;Symbol.set_functionsymbol(Function.createhere?docstring?interactive~args?optional_args?rest_argf|>Function.to_value);;letdefun_internalsymbolhere?docstring?(define_keys=[])?obsoletes?interactivetfn=letargs=get_argstindefun_rawsymbolhere?docstring?interactive:(Option.mapinteractive~f:Interactive.to_value)~args:args.required~optional_args:args.optional?rest_arg:args.restfn;List.iterdefine_keys~f:(fun(keymap,keys)->Keymap.define_keykeymap(Key_sequence.create_exnkeys)(Symbolsymbol));Option.iterobsoletes~f:(funobsolete->define_obsolete_aliasobsoletehere~alias_of:symbol~since:"who knows when"());;letdefunsymbolhere?docstring?should_profile?define_keys?obsoletes?interactive?evil_configreturnst=letfunction_=[%sexp(symbol:Symbol.t)]indefun_internal?docstring?define_keys?obsoletes?interactivesymbolheret(funargs->callthere~function_~args~returns~should_profile);Option.iterevil_config~f:(funevil_config->Evil.Config.apply_to_defunevil_configsymbol);;letdefun_nullarysymbolhere?docstring?define_keys?obsoletes?interactive?evil_configreturnsf=defunsymbolhere?docstring?define_keys?obsoletes?interactive?evil_configreturns(letopenLet_syntaxinlet%map_open()=return()inf());;letdefun_nullary_nilsymbolhere?docstring?define_keys?obsoletes?interactive?evil_configf=defun_nullarysymbolhere?docstring?define_keys?obsoletes?interactive?evil_config(ReturnsValue.Type.unit)f;;letlambdahere?docstring?interactivereturnst=letargs=get_argstinletfunction_=[%message"lambda"~_:(args:Args.t)~created_at:(here:Source_code_position.t)]inFunction.createhere?docstring?interactive:(Option.mapinteractive~f:Interactive.to_value)~optional_args:args.optional?rest_arg:args.rest~args:args.required(funargs->callthere~function_~args~returns~should_profile:None);;letlambda_nullaryhere?docstring?interactivereturnsf=lambdahere?docstring?interactivereturns(letopenLet_syntaxinlet%map_open()=return()inf());;letlambda_nullary_nilhere?docstring?interactivef=lambda_nullaryhere?docstring?interactive(ReturnsValue.Type.unit)f;;