Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Programming Languages: Type Modeling

This assignment asks you to

  • implement a simplified model of Python’s runtime member lookup in Java, and
  • implement a simplified model of Java’s compile-time type checking in Python.

This pair of exercises serves two purposes.

First, implementing something in code is a great way to think through it in detail. In class, you’ve done a lot of receptive learning: looking at pictures on the board, and following along with live coding examples. Now I want you to think through for yourself the foundations of how dynamic and statically typed languages treat data types.

Second, I want you to practice switching between languages often in this class, and to note the differences in their taste and texture as you do. For example, this assignment involves collections and unit tests in both Java and Python. How do these similar features play out across the two languages?

Please note the important difference between the two parts of this assignment: in the first part, you are simulating how Python individual objects behave at runtime, i.e. while a Python program is actually running. In the second part, you are simulating how Java checks types and resolves method calls in expressions at compile time, i.e. for all possible values that might actually show up in that expression when the code actually does run.

In both cases, I have given you a starting structure and tests that show you what you need to implement. You should not modify any of the tests in this assignment. (Do let me know if you find a mistake, however!)

Problem 0: Python in Java

In the python-attr-lookup/ directory, I have set up an IntelliJ project that provides a simplified model of Python types and objects. Your job is to implement object instantiation and attribute lookup in this model.

Part 0.0: Study the starting code

Spend some time reading through the structure of the classes under python-attr-lookup/src/, especially PythonObject and PythonType. Their javadoc describes the behavior you are aiming for. The "not implemented yet" exceptions indicate the parts you need to fill in.

Now look over the tests in PythonObjectTest.java. What do they expect to happen, and why?

Part 0.1: Implement object instantiation

Implement PythonType.instantiate(). Read the javadoc for that method to see what it is supposed to do. The solution is very simple to implement, but think carefully about what it is and why.

Implementing this will make the first test pass.

Part 0.2: Implement method resolution order

Python first looks for attributes on an object itself, then on its type and the type’s base types (i.e. superclasses). Python uses a “method resolution order” (MRO) to determine where to look for attributes and in what order. It is called “method” resolution order even though it also applies to attributes that are not methods.

Real-life Python supports a class having more than one base class (a.k.a “multiple inheritance”), and uses a fancy algorithm to work out the MRO. For this assignment, however, you will only be supporting single inheritance.

Implement PythonType.buildMRO() and PythonObject.buildMRO(). This will make the test under the MRO tests heading all pass.

Part 0.3: Implement get() and set()

Make the rest of the tests pass by implementing PythonObject.get() and PythonObject.set(). When implemented correctly, these will make all the remaining tests pass — but they should not require a large amount of code.

I recommend making the tests pass one at a time, in the order they appear in the test class. They are set up to guide you through a good implementation strategy.

Wrap it up

If you’ve been running individual test cases, go back and double check that all the tests pass.

Don’t forget to commit and push as you work!

Problem 1: Java in Python

In the java-type-checker/ directory, I have given you some Python code that provides a simplified model of Java’s static type system and expression AST. Note that there is no parser here; the test example build up the Java AST one node at a time. By “simplified,” I mean that this model captures just the most basic aspects of a very few language features: only expressions (no if statements or loops), only method calls, no generics (e.g. List<String>), not even arithmetic operations!

There is just enough structure here for you to get the feel of how a static type checker works.

Part 1.0: Study the starting code

Run these tests; they should already pass:

cd comp394-type-modeling/type-checker # If you are not already there
python3 -m tests.test_class_structure

Study those tests, and understand why they pass. Study the code in types.py and expressions.py, and understand the structure you are about to fill out. How do the roles of the things in those two files differ? What parts of Java do they represent?

Part 1.1: Implement subtype logic

Implement Type.is_subtype_of() to make these tests pass:

python3 -m tests.test_type_relationships

Part 1.2: Implement expression types

Implement static_type() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_static_types

These implementations will be quite small. Please take a moment to think about each one, what it means, and why the test is asking you to implement the behavior it describes.

Part 1.3: Implement the type checker

Implement check_types() for all the subclasses of Expression, to make these tests pass:

python3 -m tests.test_type_checking

This is the most labor-intensive part of this assignment. The tests will guide you through it; I recommend making them pass one at a time.

Many of you may be rusty on Python; if you are, please seek help from me, or from fellow students on our Slack channel. (Be careful not to post code that would give away part of the solution for other students! Do however feel free to ask “What’s the Python syntax for….”)

Because you may especially be rusty on Python string formatting, and because formatting error messages is not the point of this assignment, here are two snippets you may find useful (and that give you a tiny hit about the shape of the solution):

raiseTypeError(
"Wrong number of arguments for {0}: expected {1}, got {2}".format(
call_name,
len(expected_types),
len(actual_types)))
raiseTypeError(
"{0} expects arguments of type {1}, but got {2}".format(
call_name,
names(expected_types),
names(actual_types)))

Note that this second snippet uses the name() helper already implemented for you in expressions.py.

Part 1.4: Support null

Java’s null is a quirky special case:

  • it cannot be instantiated and
  • it has no methods, yet
  • it behaves like a subtype of every class and every interface.

Making it work properly requires a special class in our type checker, NullType. Implement it. (You will find a placeholder for it in types.py.)

You’ll find this poses some tricky questions: what should you subclass to implement it? Can it inherit any of its logic from existing classes in that file? There is no single correct answer. However, although this takes a lot of thinking, the solution does not take a lot of code. Don’t go down a rabbit hole!

Get the null tests to pass:

python3 -m tests.test_null

Wrap it up

Double check that all the tests pass:

python3 -m unittest

Commit, push, and send me a pull request to hand in your assignment. Then take a pleasant walk as you muse on how much work it must have been to implement these entire languages.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages