use a DCG to describe the path
This commit is contained in:
@@ -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) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user