|
963 | 963 |
|
964 | 964 | (defn ^:skip-wiki amp-impl
|
965 | 965 | "Do not call this directly, use '&'"
|
966 |
| - [re preds pred-forms] |
967 |
| - {::op ::amp :p1 re :ps preds :forms pred-forms}) |
| 966 | + [re re-form preds pred-forms] |
| 967 | + {::op ::amp :p1 re :amp re-form :ps preds :forms pred-forms}) |
968 | 968 |
|
969 | 969 | (defn- filter-alt [ps ks forms f]
|
970 | 970 | (if (c/or ks forms)
|
|
1071 | 1071 |
|
1072 | 1072 | (defn- deriv
|
1073 | 1073 | [p x]
|
1074 |
| - (let [{[p0 & pr :as ps] :ps, [k0 & kr :as ks] :ks, :keys [::op p1 p2 ret splice forms] :as p} (reg-resolve! p)] |
| 1074 | + (let [{[p0 & pr :as ps] :ps, [k0 & kr :as ks] :ks, :keys [::op p1 p2 ret splice forms amp] :as p} (reg-resolve! p)] |
1075 | 1075 | (when p
|
1076 | 1076 | (case op
|
1077 | 1077 | ::accept nil
|
|
1082 | 1082 | (let [ret (-> (preturn p1) (and-preds ps (next forms)))]
|
1083 | 1083 | (when-not (invalid? ret)
|
1084 | 1084 | (accept ret)))
|
1085 |
| - (amp-impl p1 ps forms))) |
| 1085 | + (amp-impl p1 amp ps forms))) |
1086 | 1086 | ::pcat (alt2 (pcat* {:ps (cons (deriv p0 x) pr), :ks ks, :forms forms, :ret ret})
|
1087 | 1087 | (when (accept-nil? p0) (deriv (pcat* {:ps pr, :ks kr, :forms (next forms), :ret (add-ret p0 ret k0)}) x)))
|
1088 | 1088 | ::alt (alt* (map #(deriv % x) ps) ks forms)
|
1089 | 1089 | ::rep (alt2 (rep* (deriv p1 x) p2 ret splice forms)
|
1090 | 1090 | (when (accept-nil? p1) (deriv (rep* p2 p2 (add-ret p1 ret nil) splice forms) x)))))))
|
1091 | 1091 |
|
1092 | 1092 | (defn- op-describe [p]
|
1093 |
| - (let [{:keys [::op ps ks forms splice p1 rep+ maybe] :as p} (reg-resolve! p)] |
| 1093 | + (let [{:keys [::op ps ks forms splice p1 rep+ maybe amp] :as p} (reg-resolve! p)] |
1094 | 1094 | ;;(prn {:op op :ks ks :forms forms :p p})
|
1095 | 1095 | (when p
|
1096 | 1096 | (case op
|
1097 | 1097 | ::accept nil
|
1098 | 1098 | nil p
|
1099 |
| - ::amp (list* 'cljs.spec.alpha/& (op-describe p1) forms) |
| 1099 | + ::amp (list* 'cljs.spec.alpha/& amp forms) |
1100 | 1100 | ::pcat (if rep+
|
1101 | 1101 | (list `+ rep+)
|
1102 | 1102 | (cons `cat (mapcat vector (c/or (seq ks) (repeat :_)) forms)))
|
|
1126 | 1126 | ::amp (if (empty? input)
|
1127 | 1127 | (if (accept-nil? p1)
|
1128 | 1128 | (explain-pred-list forms ps path via in (preturn p1))
|
1129 |
| - (insufficient path (op-describe p1))) |
| 1129 | + (insufficient path (:amp p))) |
1130 | 1130 | (if-let [p1 (deriv p1 x)]
|
1131 | 1131 | (explain-pred-list forms ps path via in (preturn p1))
|
1132 |
| - (op-explain (op-describe p1) p1 path via in input))) |
| 1132 | + (op-explain (:amp p) p1 path via in input))) |
1133 | 1133 | ::pcat (let [pkfs (map vector
|
1134 | 1134 | ps
|
1135 | 1135 | (c/or (seq ks) (repeat nil))
|
|
0 commit comments