Thanks!

-Thorsten

> Am 21.09.2017 um 10:07 schrieb Jonathan Hull <jh...@gbis.com>:
> 
> Looks like the author posted a free copy of the paper here:
> http://www.hirschfeld.org/writings/media/WeiherHirschfeld_2013_PolymorphicIdentifiersUniformResourceAccessInObjectiveSmalltalk_AcmDL.pdf
> 
> Thanks,
> Jon
> 
>> On Sep 20, 2017, at 10:03 PM, Thorsten Seitz via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> 
>>> Am 24.08.2017 um 23:07 schrieb Eagle Offshore via swift-evolution 
>>> <swift-evolution@swift.org>:
>>> 
>>> I liked the polymorphic identifiers paper presented at Dynamic Languages 
>>> Symposium 2013.
>>> 
>>> http://dl.acm.org/citation.cfm?doid=2508168.2508169
>>> 
>>> There's a lot of power in URI's that remains largely untapped in most 
>>> systems.
>>> 
>>> There's not a great reason for this heterogeneity other than historical 
>>> baggage.
>>> 
>>> Properly done, URI's can unify keypaths, user defaults, environment 
>>> variables, files, network stores, databases, etc.
>> 
>> Would you mind summarizing the idea as the paper is not freely available?
>> 
>> -Thorsten
>> 
>> 
>>>> On Aug 22, 2017, at 12:52 PM, Félix Cloutier via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> Just leaving it out here that the iOS/macOS app experience with paths is 
>>>> likely to be very different from the server (or system program) 
>>>> experience. Most of your paths are relative to a container because the 
>>>> effective root of your data is the container. I would tend to believe that 
>>>> a lot of your paths, not while fully static, could be expressed with 
>>>> something like "${DOCUMENTS}/static/part", where ${DOCUMENTS} is the only 
>>>> thing that effectively changes. A system-level program just happens to use 
>>>> / as its prefix.
>>>> 
>>>> Most platforms already have some notion of file domains, which are really 
>>>> just path prefixes (the user's home folder, the file system root, the 
>>>> network root, etc). I think that some level of support for these would be 
>>>> desirable (would it be only a set of functions that return different path 
>>>> prefixes). It's also my humble opinion that tilde expansion should be part 
>>>> of a larger shell expansion feature to avoid surprises.
>>>> 
>>>> I think that I support the conclusion.
>>>> 
>>>> Félix
>>>> 
>>>>> Le 22 août 2017 à 12:02, Dave DeLong <del...@apple.com> a écrit :
>>>>> 
>>>> 
>>>>> I suppose, if you squint at it weirdly.
>>>>> 
>>>>> My current Path API is a “Path” protocol, with “AbsolutePath” and 
>>>>> “RelativePath” struct versions. The protocol defines a path to be an 
>>>>> array of path components. The only real difference between an 
>>>>> AbsolutePath and a RelativePath is that all file system operations would 
>>>>> only take an AbsolutePath. A URL would also only provide an AbsolutePath 
>>>>> as its “path” bit.
>>>>> 
>>>>> public enum PathComponent {
>>>>>     case this // “."
>>>>>     case up   // “..” 
>>>>>     case item(name: String, extension: String?)
>>>>> }
>>>>> 
>>>>> public protocol Path {   
>>>>>     var components: Array<PathComponent> { get }
>>>>>     init(_ components: Array<PathComponent>) // used on protocol 
>>>>> extensions that mutate paths, such as appending components
>>>>> }
>>>>> 
>>>>> public struct AbsolutePath: Path { }
>>>>> public struct RelativePath: Path { }
>>>>> 
>>>>> By separating out the concept of an Absolute and a Relative path, I can 
>>>>> put additional functionality on each one to make semantic sense (you 
>>>>> cannot concatenate two absolute paths, but you can concat any path with a 
>>>>> relative path, for example). Or all file system operations must take an 
>>>>> AbsolutePath. 
>>>>> 
>>>>> One of the key things I realized is that a “Path” type should not be 
>>>>> ExpressibleByStringLiteral, because you cannot statically determine if a 
>>>>> Path should be absolute or relative. However, one of the initializers for 
>>>>> an AbsolutePath would handle things like expanding a tilde, and both 
>>>>> types try to reduce a set of components as much as possible (by filtering 
>>>>> out “.this” components, and handling “.up” components where possible, 
>>>>> etc). Also in my experience, it’s fairly rare to want to deal with a 
>>>>> known-at-compile-time, hard-coded path. Usually you’re dealing with paths 
>>>>> relative to known “containers” that are determined at runtime (current 
>>>>> user’s home folder, app’s sandboxed documents directory, etc).
>>>>> 
>>>>> Another thing I’ve done is that no direct file system operations exist on 
>>>>> AbsolutePath (like “.exists” or “.createDirectory(…)” or whatever); those 
>>>>> are still on FileManager/FileHandle/etc in the form of extensions to 
>>>>> handle the new types. In my app, a path is just a path, and it only has 
>>>>> meaning based on the thing that is using it. An AbsolutePath for a URL is 
>>>>> used differently than an AbsolutePath on a file system, although they are 
>>>>> represented with the same “AbsolutePath” type.
>>>>> 
>>>>> I’m not saying this is a perfect API of course, or even that a 
>>>>> hypothetical stdlib-provided Path should mimic this. I’m just saying that 
>>>>> for my use-case, this has vastly simplified how I deal with paths, 
>>>>> because both URL and String smell really bad for what I’m doing.
>>>>> 
>>>>> Dave
>>>>> 
>>>>>> On Aug 22, 2017, at 12:37 PM, Taylor Swift <kelvin1...@gmail.com> wrote:
>>>>>> So are you saying we need three distinct “URI” types for local-absolute, 
>>>>>> local-relative, and remote? That’s a lot of API surface to support.
>>>>>> 
>>>>>> On Tue, Aug 22, 2017 at 12:24 PM, Dave DeLong <del...@apple.com> wrote:
>>>>>>> I completely agree. URL packs a lot of punch, but IMO it’s the wrong 
>>>>>>> abstraction for file system paths.
>>>>>>> 
>>>>>>> I maintain an app that deals a lot with file system paths, and using 
>>>>>>> URL has always felt cumbersome, but String is the absolute wrong type 
>>>>>>> to use. Lately as I’ve been working on it, I’ve been experimenting with 
>>>>>>> a concrete “Path” type, similar to PathKit 
>>>>>>> (https://github.com/kylef/PathKit/). Working in terms of AbsolutePath 
>>>>>>> and RelativePath (what I’ve been calling things) has been extremely 
>>>>>>> refreshing, because it allows me to better articulate the kind of data 
>>>>>>> I’m dealing with. URL doesn’t handle pure-relative paths very well, and 
>>>>>>> it’s always a bit of a mystery how resilient I need to be about 
>>>>>>> checking .isFileURL or whatever. All the extra properties (port, user, 
>>>>>>> password, host) feel hugely unnecessary as well.
>>>>>>> 
>>>>>>> Dave
>>>>>>> 
>>>>>>>> On Aug 20, 2017, at 11:23 PM, Félix Cloutier via swift-evolution 
>>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>>> 
>>>>>>>> I'm not convinced that URLs are the appropriate abstraction for a file 
>>>>>>>> system path. For the record, I'm not a fan of existing Foundation 
>>>>>>>> methods that create objects from an URL. There is a useful and 
>>>>>>>> fundamental difference between a local path and a remote path, and 
>>>>>>>> conflating the two has been a security pain point in many languages 
>>>>>>>> and frameworks that allow it. Examples include remote file inclusion 
>>>>>>>> in PHP and malicious doctypes in XML. Windows also had its share of 
>>>>>>>> issues with UNC paths.
>>>>>>>> 
>>>>>>>> Even when loading an arbitrary URL looks innocuous, many 
>>>>>>>> de-anonymizing hacks work by causing a program to access an URL 
>>>>>>>> controlled by an attacker to make it disclose the user's IP address or 
>>>>>>>> some other ide
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to