use a DCG to describe the path

This commit is contained in:
Markus Triska
2022-08-14 08:23:39 +02:00
committed by Mark Thom
parent 44825826df
commit 0ab355eada

View File

@@ -1,5 +1,5 @@
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Written June 2020 by Markus Triska (triska@metalevel.at) Written 2020, 2022 by Markus Triska (triska@metalevel.at)
Part of Scryer Prolog. Part of Scryer Prolog.
Predicates for reasoning about files and directories. Predicates for reasoning about files and directories.
@@ -65,6 +65,7 @@
:- use_module(library(error)). :- use_module(library(error)).
:- use_module(library(lists)). :- use_module(library(lists)).
:- use_module(library(charsio)). :- use_module(library(charsio)).
:- use_module(library(dcgs)).
directory_files(Directory, Files) :- directory_files(Directory, Files) :-
must_be(chars, Directory), must_be(chars, Directory),
@@ -198,19 +199,19 @@ path_segments(Path, Segments) :-
( var(Path) -> ( var(Path) ->
must_be(list, Segments), must_be(list, Segments),
maplist(must_be(chars), Segments), maplist(must_be(chars), Segments),
append_with_separator(Segments, Sep, Path) phrase(append_with_separator(Segments, Sep), Path)
; must_be(chars, Path), ; must_be(chars, Path),
path_to_segments(Path, Sep, Segments) path_to_segments(Path, Sep, Segments)
). ).
append_with_separator([], _, []). append_with_separator([], _) --> [].
append_with_separator([Segment|Segments], Sep, Path) :- append_with_separator([Segment|Segments], Sep) -->
append_with_separator_(Segments, Segment, Sep, Path). append_with_separator_(Segments, Segment, Sep).
append_with_separator_([], Segment, _, Segment). append_with_separator_([], Segment, _) --> seq(Segment).
append_with_separator_([Segment|Segments], Prev, Sep, Path) :- append_with_separator_([Segment|Segments], Prev, Sep) -->
append(Prev, [Sep|Rest], Path), seq(Prev), [Sep],
append_with_separator_(Segments, Segment, Sep, Rest). append_with_separator_(Segments, Segment, Sep).
path_to_segments(Path, Sep, Segments) :- path_to_segments(Path, Sep, Segments) :-
( append(Front, [Sep|Ps], Path) -> ( append(Front, [Sep|Ps], Path) ->