From ee63e122ea5019cfdd837841466c2d1fa10acb6b Mon Sep 17 00:00:00 2001 From: Philip Monk Date: Thu, 31 Oct 2019 14:56:54 -0700 Subject: [PATCH] dojo, auto: move insert-magic logic to lib/auto This changes the entry-points in lib/auto so that clients never have to handle magic-spoon. You can specify either a tape of code with a position index or a preparsed hoon (presumably you ran +insert-magic before parsing). --- pkg/arvo/app/dojo.hoon | 24 ++---------- pkg/arvo/lib/auto.hoon | 89 +++++++++++++++++++++++++++--------------- 2 files changed, 61 insertions(+), 52 deletions(-) diff --git a/pkg/arvo/app/dojo.hoon b/pkg/arvo/app/dojo.hoon index db67b641b..a5592ffe3 100644 --- a/pkg/arvo/app/dojo.hoon +++ b/pkg/arvo/app/dojo.hoon @@ -1100,31 +1100,13 @@ |= pos=@ud ^+ +> =* res +> - =/ buf (tufa buf.say) - :: Find beg-pos by searching backward to where the current term - :: begins - =+ ^- [id=(unit term) *] - (scan `tape`(flop (scag pos buf)) ;~(plug (punt sym) (star prn))) - =/ beg-pos - ?~ id - pos - (sub pos (met 3 u.id)) - =/ txt=tape - ;: weld - (scag beg-pos buf) - "magic-spoon" - ?~ id - "" - "." - (slag beg-pos buf) - "\0a" - == + =+ [beg-pos=@ud txt=tape]=(insert-magic:auto pos (tufa buf.say)) =+ vex=((full parse-command-line:he-parser) [1 1] txt) ?. ?=([* ~ [* @ %ex *] *] vex) res =/ typ p:(slop q:he-hoon-head !>(..dawn)) - =/ tl (tablist:auto typ p.q.q.p.u.q.vex) - =/ advance (autoadvance:auto typ p.q.q.p.u.q.vex) + =/ tl (tab-list-hoon:auto typ p.q.q.p.u.q.vex) + =/ advance (advance-hoon:auto typ p.q.q.p.u.q.vex) =? res ?=(^ advance) =/ to-send (trip (rsh 3 (sub pos beg-pos) u.advance)) =| fxs=(list sole-effect) diff --git a/pkg/arvo/lib/auto.hoon b/pkg/arvo/lib/auto.hoon index 341d93d4b..0fa75ef3e 100644 --- a/pkg/arvo/lib/auto.hoon +++ b/pkg/arvo/lib/auto.hoon @@ -2,6 +2,9 @@ :: |% +$ ids (list [=term =type]) +:: +:: Get all the identifiers accessible if this type is your subject. +:: ++ get-identifiers |= ty=type %- flop @@ -42,6 +45,8 @@ [%hold *] $(ty ~(repo ut ty)) == :: +:: Get all the identifiers that start with sid. +:: ++ search-prefix |= [sid=term =ids] ^- (list [term type]) @@ -49,6 +54,8 @@ |= [id=term ty=type] =(sid (end 3 (met 3 sid) id)) :: +:: Get the longest prefix of a list of identifiers. +:: ++ longest-match |= matches=(list [=term =type]) ^- term @@ -68,6 +75,9 @@ $(n +(n)) (end 3 (dec n) term.i.matches) :: +:: Run +find-type safely, printing the first line of the stack trace on +:: error. +:: ++ find-type-mule |= [sut=type gen=hoon] ^- (unit [term type]) @@ -190,49 +200,66 @@ ^- (unit [term type]) !! :: -++ replace-hax - |= code=tape - %+ scan code - %+ cook - |= res=(list $@(@ [~ (unit term)])) - %- trip - %- crip - %+ turn res - |= elem=$@(@ [~ (unit term)]) - ?@ elem - elem - ?~ +.elem - 'magic-spoon' - (cat 3 'magic-spoon.' u.+.elem) - %- star - ;~ pose - ;~ less - hax - prn - == +:: Insert magic marker in hoon source at the given position. +:: +++ insert-magic + |= [pos=@ud txt=tape] + ^- [beg-pos=@ud txt=tape] + :: Find beg-pos by searching backward to where the current term + :: begins :: - (stag ~ ;~(pfix hax (punt sym))) + =+ ^- [id=(unit term) *] + (scan `tape`(flop (scag pos txt)) ;~(plug (punt sym) (star prn))) + =/ beg-pos + ?~ id + pos + (sub pos (met 3 u.id)) + :- beg-pos + :: Insert "magic-spoon" marker so +find-type can identify where to + :: stop. + :: + ;: weld + (scag beg-pos txt) + "magic-spoon" + ?~ id + "" + "." + (slag beg-pos txt) + "\0a" == :: -++ autoadvance +:: Produce the longest possible advance without choosing between +:: matches. +:: +:: Takes a +hoon which has already has a magic-spoon marker. Useful if +:: you want to handle your own parsing. +:: +++ advance-hoon |= [sut=type gen=hoon] %+ bind (find-type-mule sut gen) |= [id=term typ=type] (longest-match (search-prefix id (get-identifiers typ))) :: -++ auto-advance - |= [sut=type code=cord] - (autoadvance sut (scan (replace-hax (trip code)) vest)) +:: Same as +advance-hoon, but takes a position and text directly. :: -++ tablist +++ advance-tape + |= [sut=type pos=@ud code=tape] + (advance-hoon sut (scan txt:(insert-magic pos code) vest)) +:: +:: Produce a list of matches. +:: +:: Takes a +hoon which has already has a magic-spoon marker. Useful if +:: you want to handle your own parsing. +:: +++ tab-list-hoon |= [sut=type gen=hoon] %+ bind (find-type-mule sut gen) |= [id=term typ=type] (search-prefix id (get-identifiers typ)) :: -++ tab-list - |= [sut=type code=cord] - %+ bind (find-type sut (scan (replace-hax (trip code)) vest)) - |= [id=term typ=type] - (search-prefix id (get-identifiers typ)) +:: Same as +advance-hoon, but takes a position and text directly. +:: +++ tab-list-tape + |= [sut=type pos=@ud code=tape] + (tab-list-hoon sut (scan txt:(insert-magic pos code) vest)) --