以下のポート仕様では、URL を解析してユーザー、パス、ホスト、およびパスを決定しようとしています。ユーザー/パスの値はオプションですが、存在しない場合はそれぞれにデフォルト値を設定したいと思います。
しかし、user/pass が存在しない場合、user
/pass
はオブジェクトから省略されていport/spec
ます。これはなぜでしょうか?
>> read sch://foo/bar.r
PORT/SPEC is an object of value:
title string! "Wee Scheme"
scheme word! sch
ref url! sch://foo/bar.r
path string! "/bar.r"
host string! "foo"
>> read sch://foo:bar@foo/bar.r
PORT/SPEC is an object of value:
title string! "Wee Scheme"
scheme word! sch
ref url! sch://foo:bar@foo/bar.r
path string! "/bar.r"
pass string! "bar"
user string! "foo"
host string! "foo"
また、この質問の草案を作成する際に、スキームに誤りがあり、パース ルールをport
ではなく にバインドしましたport/spec
—how are the values then set in the port/spec
object?
仕様:
sys/make-scheme [
name: 'sch
title: "Wee Scheme"
actor: [
read: func [port][
parse port/spec/ref use [chars][
chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" "-_!+%.,"]
bind [
"sch://" [
copy user some chars #":"
copy pass some chars #"@"
| (user: 'mince pass: 'tatties)
]
copy host some chars
copy path [some [#"/" any chars]]
end
] port
]
? port/spec
]
]
]