Skip to content

Instantly share code, notes, and snippets.

@maximvl maximvl/info.red forked from toomasv/info.red
Created Sep 4, 2017

Embed
What would you like to do?
To get info about any function
Red []
info: func ['fn /name /intro /args /refinements /locals /return /spec
/arg-num /arg-names /arg-types /ref-names /ref-types /ref-num /type
/local intr ars refs locs ret arg ref typ
][
intr: copy "" ars: make map! copy [] refs: make map! copy [] locs: copy [] ret: copy [] typ: ref-arg: ref-arg-type: none
if lit-word? fn [fn: to-word fn]
unless find [op! native! function! action!] type?/word get fn [
cause-error 'user 'message ["Only function types accepted!"]
]
out: make map! copy []
specs: spec-of get fn
parse specs [
opt [set intr string!]
any [set arg [word! | lit-word!] opt [set typ block!] opt string! (put ars arg either typ [typ][[any-type!]])]
any [set ref refinement! [
if (ref <> /local) (put refs to-lit-word ref make map! copy [])
opt string!
any [set ref-arg word! opt [set ref-arg-type block!]
(put refs/(to-word ref) to-lit-word ref-arg either ref-arg-type [ref-arg-type][[any-type!]])
]
| any [set loc word! (append locs loc) opt string!]
opt [set-word! set ret block!]
]]
(
out: case [
name [to-word fn]
intro [intr]
args [ars]
arg-num [length? ars]
arg-names [copy keys-of ars]
arg-types [copy values-of ars]
refinements [refs]
ref-names [copy keys-of refs]
ref-types [copy values-of refs]
ref-num [length? refs]
locals [locs]
return [ret]
spec [specs]
true [
make object! [
name: to-word fn
intro: intr
args: ars
refinements: refs
locals: locs
return: ret
spec: specs
type: type? get fn
arg-num: length? args
arg-names: copy keys-of args
arg-types: copy values-of args
ref-names: copy keys-of refinements
ref-types: copy values-of refinements
ref-num: length? refinements
]
]
])
]
out
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.