Skip to content

Instantly share code, notes, and snippets.

@sbchisholm
Created October 1, 2014 18:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sbchisholm/2e737aed21ea70b63bc7 to your computer and use it in GitHub Desktop.
Save sbchisholm/2e737aed21ea70b63bc7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"language": "Julia",
"name": "Self Generating Class Attributes"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "import Base: getindex, haskey, setindex!",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": "type Context\n _attr::Dict{Symbol,Any}\n Context() = new(Dict{Symbol,Any}())\n Context(attr::Dict{Symbol,Any}) = new(attr)\nend",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "function getindex(context::Context, key::Symbol)\n if haskey(context._attr, key)\n return context._attr[key]\n else\n # TODO: Keep track of what attributes we are generating on \n # so that we don't end up in an infinite loop.\n try\n generate_fn = eval(symbol(string(\"generate_\", key)))\n context._attr[key] = generate_fn(context)\n return context._attr[key]\n catch exception\n error(\"Error getting attribute '$key': $exception\")\n end\n end\nend\n\nfunction setindex!(context::Context, value::Any, key::Symbol)\n context._attr[key] = value\nend\n\nfunction haskey(context::Context, key::Symbol)\n return haskey(context._attr, key)\nend",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": "haskey (generic function with 5 methods)"
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "function generate_foo(context::Context)\n return \"bar\"\nend",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": "generate_foo (generic function with 1 method)"
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": "c = Context()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": "Context(Dict{Symbol,Any}())"
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": "c[:foo]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": "\"bar\""
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": "c[:Foo]",
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "LoadError",
"evalue": "Error getting attribute 'Foo': ErrorException(\"generate_Foo not defined\")\nat In[7]:1",
"output_type": "pyerr",
"traceback": [
"Error getting attribute 'Foo': ErrorException(\"generate_Foo not defined\")\nat In[7]:1",
" in error at error.jl:21",
" in getindex at In[3]:10"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": "c[:a] = 2",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": "2"
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": "generate_b(context::Context) = 10 * context[:a]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": "generate_b (generic function with 1 method)"
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": "c[:b]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": "20"
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": "haskey(c, :b)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": "true"
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": "haskey(c, :c)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": "false"
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": "",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment