Prog8 Documentation Release 1.50-Dev Irmen De Jong

Total Page:16

File Type:pdf, Size:1020Kb

Prog8 Documentation Release 1.50-Dev Irmen De Jong Prog8 Documentation Release 1.50-dev Irmen de Jong Aug 05, 2019 Contents of this manual: 1 What is Prog8? 3 2 Code examples 5 3 Design principles and features9 4 Required tools 11 4.1 Target system specification........................................ 11 4.2 Writing and building a program..................................... 14 4.3 Programming in Prog8.......................................... 16 4.4 Syntax Reference............................................. 28 4.5 TODO.................................................. 39 5 Index 41 Index 43 i ii Prog8 Documentation, Release 1.50-dev Contents of this manual: 1 Prog8 Documentation, Release 1.50-dev 2 Contents of this manual: CHAPTER 1 What is Prog8? This is an experimental compiled programming language targeting the 8-bit 6502/ 6510 microprocessor. This CPU is from the late 1970’s and early 1980’s and was used in many home computers from that era, such as the Commodore- 64. The language aims to provide many conveniences over raw assembly code (even when using a macro assembler), while still being low level enough to create high performance programs. Prog8 is copyright © Irmen de Jong ([email protected]| http://www.razorvine.net). The project is on github: https://github.com/irmen/prog8.git This software is licensed under the GNU GPL 3.0, see https://www.gnu.org/licenses/gpl.html 3 Prog8 Documentation, Release 1.50-dev 4 Chapter 1. What is Prog8? CHAPTER 2 Code examples This code calculates prime numbers using the Sieve of Eratosthenes algorithm: %import c64utils %zeropage basicsafe main { ubyte[256] sieve ubyte candidate_prime = 2 sub start() { memset(sieve, 256, false) c64scr.print("prime numbers up to 255:\n\n") ubyte amount=0 while true { ubyte prime = find_next_prime() if prime==0 break c64scr.print_ub(prime) c64scr.print(", ") amount++ } c64.CHROUT('\n') c64scr.print("number of primes (expected 54): ") c64scr.print_ub(amount) c64.CHROUT('\n') } sub find_next_prime() -> ubyte { while sieve[candidate_prime] { candidate_prime++ (continues on next page) 5 Prog8 Documentation, Release 1.50-dev (continued from previous page) if candidate_prime==0 return 0 } sieve[candidate_prime] = true uword multiple = candidate_prime while multiple < len(sieve) { sieve[lsb(multiple)] = true multiple += candidate_prime } return candidate_prime } } when compiled an ran on a C-64 you get this: The following programs shows a use of the high level struct type: %import c64utils %zeropage basicsafe main { struct Color { ubyte red ubyte green ubyte blue } sub start() { Color purple = {255, 0, 255} Color other other = purple other.red /= 2 other.green = 10 + other.green / 2 other.blue = 99 c64scr.print_ub(other.red) c64.CHROUT(',') c64scr.print_ub(other.green) c64.CHROUT(',') (continues on next page) 6 Chapter 2. Code examples Prog8 Documentation, Release 1.50-dev (continued from previous page) c64scr.print_ub(other.blue) c64.CHROUT('\n') } } when compiled and ran, it prints 127,10,99 on the screen. 7 Prog8 Documentation, Release 1.50-dev 8 Chapter 2. Code examples CHAPTER 3 Design principles and features • It is a cross-compiler running on modern machines (Linux, MacOS, Windows, . ) The generated output is a machine code program runnable on actual 8-bit 6502 hardware. • Usable on most operating systems. • Based on simple and familiar imperative structured programming paradigm. • ‘One statement per line’ code style, resulting in clear readable programs. • Modular programming and scoping via modules, code blocks, and subroutines. • Provide high level programming constructs but stay close to the metal; still able to directly use memory ad- dresses, CPU registers and ROM subroutines • Arbitrary number of subroutine parameters (constrained only by available memory) • Complex nested expressions are possible • Values are typed. Types supported include signed and unsigned bytes and words, arrays, strings and floats. • No dynamic memory allocation or sizing! All variables stay fixed size as determined at compile time. • Provide various quality of life language features and library subroutines specifically for the target platform. • Provide a very convenient edit/compile/run cycle by being able to directly launch the compiled program in an emulator and provide debugging information to the emulator. • The compiler outputs a regular 6502 assembly source code file, but doesn’t assemble this itself. The (separate) ‘64tass’ cross-assembler tool is used for that. • Goto is usually considered harmful, but not here: arbitrary control flow jumps and branches are possible, and will usually translate directly into the appropriate single 6502 jump/branch instruction. • There are no complicated built-in error handling or overflow checks, you’ll have to take care of this yourself if required. This keeps the language and code simple and efficient. • The compiler tries to optimize the program and generated code, but hand-tuning of the performance or space- critical parts will likely still be required. This is supported by the ability to easily write embedded assembly code directly in the program source code. 9 Prog8 Documentation, Release 1.50-dev 10 Chapter 3. Design principles and features CHAPTER 4 Required tools 64tass - cross assembler. Install this on your shell path. A recent .exe version of this tool for Windows can be obtained from my clone of this project. For other platforms it is very easy to compile it yourself (make ; make install). A Java runtime (jre or jdk), version 8 or newer is required to run the packaged compiler. If you’re scared of Oracle’s licensing terms, most Linux distributions ship OpenJDK instead and for Windows it’s possible to get that as well. Check out AdoptOpenJDK for downloads. Finally: a C-64 emulator (or a real C-64 ofcourse) to run the programs on. The compiler assumes the presence of the Vice emulator. Important: Building the compiler itself: (Only needed if you have not downloaded a pre-built ‘fat-jar’) (re)building the compiler itself requires a recent Kotlin SDK. The compiler is developed using the IntelliJ IDEA IDE from Jetbrains, with the Kotlin plugin (free community edition of this IDE is available). But a bare Kotlin SDK installation should work just as well. Instructions on how to obtain a working compiler are in First, getting a working compiler. 4.1 Target system specification Prog8 targets the following hardware: • 8 bit MOS 6502/6510 CPU • 64 Kb addressable memory (RAM or ROM) • memory mapped I/O registers The main target machine is the Commodore-64, which is an example of this. This chapter explains the relevant system details of such a machine. 11 Prog8 Documentation, Release 1.50-dev 4.1.1 Memory Model Physical address space layout The 6502 CPU can address 64 kilobyte of memory. Most of the 64 kilobyte address space can be used by Prog8 programs. This is a hard limit: there is no built-in support for RAM expansions or bank switching. memory area type note $00–$ff ZeroPage contains many sensitive system variables $100–$1ff Hardware stack used by the CPU, normally not accessed directly $0200–$ffff Free RAM or ROM free to use memory area, often a mix of RAM and ROM A few of these memory addresses are reserved and cannot be used for arbitrary data. They have a special hardware function, or are reserved for internal use in the code generated by the compiler: reserved address in use for $00 data direction (CPU hw) $01 bank select (CPU hw) $02 internal scratch variable $03 internal scratch variable $fb - $fc internal scratch variable $fd - $fe internal scratch variable $fffa - $fffb NMI vector (CPU hw) $fffc - $fffd RESET vector (CPU hw) $fffe - $ffff IRQ vector (CPU hw) The actual machine will often have many other special addresses as well, For example, the Commodore-64 has: • ROMs installed in the machine: BASIC, kernal and character roms. Occupying $a000–$bfff and $e000–$ffff. • memory-mapped I/O registers, for the video and sound chips, and the CIA’s. Occupying $d000–$dfff. • RAM areas that are used for screen graphics and sprite data: usually at $0400–$07ff. Prog8 programs can access all of those special memory locations but it will have a special meaning. ZeroPage (“ZP”) The ZeroPage memory block $02–$ff can be regarded as 254 CPU ‘registers’, because they take less clock cycles to access and need fewer instruction bytes than accessing other memory locations outside of the ZP. Theoretically they can all be used in a program, with the follwoing limitations: • several addresses ($02, $03, $fb - $fc, $fd - $fe) are reserved for internal use • most other addresses will already be in use by the machine’s operating system or kernal, and overwriting them will probably crash the machine. It is possible to use all of these yourself, but only if the program takes over the entire system (and seizes control from the regular kernal). This means it can no longer use (most) BASIC and kernal routines from ROM. • it’s more convenient and safe to let the compiler allocate these addresses for you and just use symbolic names in the program code. Prog8 knows what addresses are safe to use in the various ZP handling configurations. It will use the free ZP addresses to place its ZP variables in, until they’re all used up. If instructed to output a program that takes over the entire machine, (almost) all of the ZP addresses are suddenly available and will be used. 12 Chapter 4. Required tools Prog8 Documentation, Release 1.50-dev ZeroPage handling is configurable: There’s a global program directive to specify the way the compiler treats the ZP for the program. The default is to be reasonably restrictive to use the part of the ZP that is not used by the C64’s kernal routines. It’s possible to claim the whole ZP as well (by disabling the operating system or kernal). If you want, it’s also possible to be more restricive and stay clear of the addresses used by BASIC routines too.
Recommended publications
  • Chapter 2 Core Basics
    Chapter 2 Core Basics In this chapter we introduce some of the basic concepts that are important for understanding what is to follow. We also introduce a few of the fundamental operations that are involved in the vast majority of useful programs. 2.1 Literals and Types Section 1.3 introduced the string literal. A string literal is a collection of characters enclosed in quotes. In general, a literal is code that exactly represents a value. In addition to a string literal, there are numeric literals. There are actually a few different types of numeric values in Python. There are integer values which correspond to whole numbers (i.e., the countable numbers that lack a fractional part). In Python, an integer is known as an int. A number that can have a fractional part is called a float (a float corresponds to a real number). For example, 42 is an int while 3.14 is a float. The presence of the decimal point makes a number a float—it doesn’t matter if the fractional part is zero. For example, the literal 3.0, or even just 3., are also floats1 despite the fact that these numbers have fractional parts of zero.2 There are some important differences between how computers work with ints and floats. For example, ints are stored exactly in the computer while, in general, floats are only stored approximately. This is a consequence of the fact that we are entering numbers as decimal numbers, i.e., numbers in the base 10 counting system, but the computer stores these numbers internally as a finite number of binary (base 2) digits.
    [Show full text]
  • Lecture 3: Its Time to See the C
    Computer Science 61C Spring 2017 Friedland and Weaver Lecture 3: Its time to see the C... 1 Agenda Computer Science 61C Spring 2017 Friedland and Weaver • Computer Organization • Compile vs. Interpret • C vs Java 2 ENIAC (U.Penn., 1946) First Electronic General-Purpose Computer Computer Science 61C Spring 2017 Friedland and Weaver • Blazingly fast (multiply in 2.8ms!) • 10 decimal digits x 10 decimal digits • But needed 2-3 days to setup new program, as programmed with patch cords and switches • At that time & before, "computer" mostly referred to people who did calculations 3 EDSAC (Cambridge, 1949) First General Stored-Program Computer Computer Science 61C Spring 2017 Friedland and Weaver • Programs held as numbers in memory • This is the revolution: It isn't just programmable, but the program is just the same type of data that the computer computes on • 35-bit binary 2’s complement words 4 Components of a Computer Computer Science 61C Spring 2017 Friedland and Weaver Memory Processor Input Enable? Read/Write Control Program Datapath Address PC Bytes Write Registers Data Arithmetic & Logic Unit Read Data Output (ALU) Data Processor-Memory Interface I/O-Memory Interfaces 5 Great Idea: Levels of Representation/Interpretation Computer Science 61C Spring 2017 Friedland and Weaver temp = v[k]; High Level Language v[k] = v[k+1]; We are here! Program (e.g., C) v[k+1] = temp; lw $t0, 0($2) Compiler Anything can be represented lw $t1, 4($2) Assembly Language as a number, sw $t1, 0($2) Program (e.g., MIPS) i.e., data or instructions sw $t0, 4($2)
    [Show full text]
  • Unary Operator
    Introduction to Python Operations and Variables 1 Topics 1) Arithmetic Operations 2) Floor Division vs True Division 3) Modulo Operator 4) Operator Precedence 5) String Concatenation 6) Augmented Assignment 2 Arithmetic Operations 3 Mixing Types Any expression that two floats produce a float. x = 17.0 – 10.0 print(x) # 7.0 When an expression’s operands are an int and a float, Python automatically converts the int to a float. x = 17.0 – 10 print(x) # 7.0 y = 17 – 10.0 print(y) # 7.0 4 True Division vs Floor Division The operator / is true division and the operator // returns floor division(round down after true divide). True divide / always gives the answer as a float. print(23 // 7) # 3 print(3 // 9) # 0 print(-4 // 3) # -2 print(6 / 5) # 1.2 print(6 / 3) # 2.0 NOT 2! 5 Remainder with % The % operator computes the remainder after floor division. • 14 % 4 is 2 • 218 % 5 is 3 3 43 4 ) 14 5 ) 218 12 20 2 18 15 3 Applications of % operator: • Obtain last digit of a number: 230857 % 10 is 7 • Obtain last 4 digits: 658236489 % 10000 is 6489 • See whether a number is odd: 7 % 2 is 1, 42 % 2 is 0 6 Modulo Operator The operator % returns the modulus which is the remainder after floor division. print(18 % 5) # 3 print(2 % 9) # 2, if first number is smaller, it's the answer print(125 % 10) # 5 print(0 % 10) # 0 print(10 % 0) # ZeroDivisionError 7 Why floor/modulo division is useful Floor division allows us to extract the integer part of the division while the modulo operator extracts the remainder part of the division.
    [Show full text]
  • Icon Analyst 8
    In-Depth Coverage of the Icon Programming Language October 1991 Number 8 subject := OuterEnvir.subject object := OuterEnvir.object s_pos := OuterEnvir.s_pos In this issue … o_pos := OuterEnvir.o_pos fail String Synthesis … 1 An Imaginary Icon Computer … 2 end Augmented Assignment Operations … 7 procedure Eform(OuterEnvir, e2) The Icon Compiler … 8 local InnerEnvir Programming Tips … 12 InnerEnvir := What’s Coming Up … 12 XformEnvir(subject, s_pos, object, o_pos) subject := OuterEnvir.subject String Synthesis object := OuterEnvir.object s_pos := OuterEnvir.s_pos In the last issue of the Analyst, we posed the problem o_pos := OuterEnvir.o_pos of implementing a string-synthesis facility for Icon, using the ideas given earlier about modeling the string-scanning control suspend InnerEnvir.object structure. OuterEnvir.subject := subject Our solution is given below. First we need procedures OuterEnvir.object := object analogous to the procedure used for modeling string scanning. OuterEnvir.s_pos := s_pos In addition to a subject, there’s now an “object”, which is the OuterEnvir.o_pos := o_pos result of string synthesis. There now also are two positions, subject := InnerEnvir.subject one in the subject and one in the object. The global identifiers object := InnerEnvir.object subject, object, s_pos, and o_pos are used for these four s_pos := InnerEnvir.s_pos “state variables” in the procedures that follow. (In a real o_pos := InnerEnvir.o_pos implementation, these would be keywords.) fail The string synthesis control structure is modeled as end expr1 ? expr2 → Eform(Bform(expr1),expr2) Most of the procedures specified in the last issue of the are straightforward. Care must be taken, however, The procedures Bform() and Eform() are very similar Analyst to assure that values assigned to the positions are in range — to Bscan() and Escan() used in the last issue of the Analyst this is done automatically for the keyword &pos, but it must for modeling string scanning.
    [Show full text]
  • View the Index
    INDEX Numbers and Symbols __(double underscore), using in 256 objects and 257 objects, 154–155 dunder methods, 322. See also ./, using with Ubuntu, 42 underscore (_) /? command line argument, 25–26 / (forward slash) = assignment operator, 113 purpose of, 18 == comparison operator, 113, 336 using with command line chaining, 103, 105 arguments, 25 using to compare objects, 154 # (hash mark) using with None, 94–95 using with comments, 183 != comparison operator, 336 using with docstrings, 188 * and ** syntax [] (index operator), using, 117 using to create variadic functions, ; (semicolons), using with timeit 167–171 module, 226–227 using to create wrapper functions, ' (single quote), using, 46 171–172 ~ (tilde), using in macOS, 23 using with arguments and - (unary operator), 155–157 functions, 166–167 + (unary operator), 156–157 * character, using as wildcard, 28–29 _ (underscore) ? character, using as wildcard, 28–29 PEP 8’s naming conventions, [:] syntax, using, 104 60–61 < comparison operator, 337 as prefix for methods and <= comparison operator, 337 attributes, 291–292 > comparison operator, 337 private prefix, 81 >= comparison operator, 337 using with _spaces attribute, 290 -> (arrow), using with type hints, 191 using with dunder methods, 120 \ (backslash) using with private attributes and purpose of, 18 methods, 283 using with strings, 95 using with WizCoin class, 279 : (colon), using with lists, 97–98, 104 , (comma), including in single-item A tuples, 150 abcTraceback.py program, saving, 4 - (dash), using with command line __abs__() numeric dunder arguments, 25 method, 328 $ (dollar sign), using in macOS, 23 absolute versus relative paths, 20–21 . (dot), using with commands, 31 __add__() numeric dunder method, 327 -- (double dash), using with command addToTotal() function, creating, line arguments, 25 172–173 algebra for big O, 236 base class, relationship to algorithm analysis.
    [Show full text]
  • If We Dont Declare Keyword Static
    If We Dont Declare Keyword Static If expositive or harborless Thornie usually miching his inby brabbling super or predestinated stingingly and theatrically, how unruffled is Daren? Rube puke thoughhis Akkadian Peyton comps induing unshakably, his incomprehensiveness but demulcent Harcourt preappoint. never specialise so outlandishly. Inmost and rebel Aloysius quintuplicating almost suspiciously, Factory methods that scope for data besides the instantiation until recently and useful to be called from the stack overflow the static serve any developer should declare static if we dont need dark matter Java and scope, if we dont declare keyword static. If we dont need it into a nonthrowing method if my own risk of indexing, if we dont declare keyword static fields or auto variable? Then we dont want to declaration at the keyword in the namespace. Like declaring a declaration in my name, declare them the struct static methods are not supported in their intended use is. Suppose you dont need it becomes available in many issues with a keyword? Dm hold data field does hold distinct value you if we dont declare keyword static, but can be striving to. So if you declare more memory is declared locally in this keyword was good style guide to. If we declare two different keywords used to declaring multiple interfaces. The declaration to declare methods if you dont want to use the different keywords used with? Svalbard and remember that keyword, log stuff exported by making a functional, if we dont declare static keyword in scope of. The result in java is if they use a c compiler you if we dont declare static keyword in java, we dont want.
    [Show full text]
  • 2.13 Augmented Assignment Operators
    Chapter 2 Elementary Programming 2.1 Introduction • You will learn elementary programming using Java primitive data types and related subjects, such as variables, constants, operators, expressions, and input and output. 2.2 Writing Simple Programs • Writing a program involves designing algorithms and data structures, as well as translating algorithms into programming code. • An Algorithm describes how a problem is solved in terms of the actions to be executed, and it specifies the order in which the actions should be executed. • Computing an area of a circle. The algorithm for this program can be described as follows: 1. Read in the Radius 2. Compute the area using the following formula: Area = radius * radius * ∏ 3. Display the area. • Java provides data types for representing integers, floating-point numbers, characters, and Boolean types. These types are known as primitive data types. • When you code, you translate an algorithm into a programming language understood by the computer. • The outline of the program is: public class ComputeArea { public static void main(String[] args) { double radius; // Declare radius double area; // Declare area // Assign a radius radius = 20; // New value is radius // Compute area area = radius * radius * 3.14159; // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } CMPS161 Class Notes (Chap 02) Page 1 / 21 Dr. Kuo-pao Yang • The program needs to declare a symbol called a variable that will represent the radius. Variables are used to store data and computational results in the program. • Use descriptive names rather than x and y. Use radius for radius, and area for area.
    [Show full text]
  • Explicit and Controllable Assignment Semantics
    Explicit and Controllable Assignment Semantics Dimitri Racordon Didier Buchs University of Geneva University of Geneva Centre Universitaire d’Informatique Centre Universitaire d’Informatique Switzerland Switzerland [email protected] [email protected] Abstract continuing growth in computing power, contemporary pro- Despite the plethora of powerful software to spot bugs, iden- gramming languages can sit at very high levels of abstrac- tify performance bottlenecks or simply improve the over- tions, letting developers convey their intent with great ex- all quality of code, programming languages remain the first pressiveness. Unfortunately, this evolution also brings the and most important tool of a developer. Therefore, appro- potential for more inadvertent behaviors, as the small imper- priate abstractions, unambiguous syntaxes and intuitive se- fections in these many layers of abstractions usually have mantics are paramount to convey intent concisely and effi- deep consequences on a language’s semantics. This is partic- ciently. The continuing growth in computing power has al- ularly true for the imperative paradigm, in which the inter- lowed modern compilers and runtime system to handle once play between variables and memory can prove to be a pro- thought unrealistic features, such as type inference and re- lific source of puzzling bugs. For instance, most mainstream flection, making code simpler to write and clearer to read. object-oriented programming languages have a limited sup- Unfortunately, relics of the underlying memory model still port to express aliasing explicitly, blurring the distinction transpire in most programming languages, leading to con- between object mutation and reference reassignment, and fusing assignment semantics. often leading to erroneous assumptions about sharing and This paper introduces Anzen, a programming language immutability.
    [Show full text]
  • Idiomatic Python 1 Idiomati
    Cambridge University Press 978-1-108-48884-6 — Numerical Methods in Physics with Python Alex Gezerlis Excerpt More Information Idiomatic Python 1 Idiomati That which you inherit from your forefathers, you must make your own in order to truly possess it. Johann Wolfgang von Goethe This chapter is not intended as an introduction to programming in general or to program- ming with Python. A tutorial on the Python programming language can be found in the online supplement to this book; if you’re still learning what variables, loops, and functions are, we recommend you go to our tutorial (see Appendix A) before proceeding with the rest of this chapter. You might also want to have a look at the (official) Python Tutorial at www.python.org. Another introduction to Python, with nice material on visualization, is Ref. [41]. Programming, like most other activities, is something you learn by doing. Thus, you should always try out programming-related material as you read it: there is no royal road to programming. Even if you have solid programming skills but no familiarity with Python, we recommend you work your way through one of the above resources, to famil- iarize yourself with the basic syntax. In what follows, we will take it for granted that you have worked through our tutorial and have modified the different examples to carry out further tasks. This includes solving many of the programming problems we pose there. What this chapter does provide is a quick summary of Python features, with an emphasis on those which the reader is more likely not to have encountered in the past.
    [Show full text]
  • Lecture 3.2: Overview Keywords in C
    EECS10: Comp. Methods in ECE Lecture 3 Lecture 3.2: Overview • Keywords in C • Counters – Augmented Assignment Operators – Increment and Decrement Operators • Repetition Statements – while loop • Counter-controlled repetition –Example Average.c • Sentinel-controlled repetition –Example Average2.c EECS10: Computational Methods in ECE, Lecture 3 (c) 2013 R. Doemer 1 Keywords in C • List of keywords in ANSI-C – auto – double – int – struct – break – else – long – switch – case – enum – register – typedef – char – extern – return – union – const – float – short – unsigned – continue – for – signed – void – default – goto – sizeof – volatile – do – if – static – while – These keywords are reserved! – Keywords cannot be used as identifiers. – More keywords are reserved for C++ EECS10: Computational Methods in ECE, Lecture 3 (c) 2013 R. Doemer 2 (c) 2013 R. Doemer 1 EECS10: Comp. Methods in ECE Lecture 3 Augmented Assignment Operators • Assignment operator: = – evaluates right-hand side – assigns result to left-hand side • Augmented assignment operators: +=, *=, ... – evaluates right-hand side as temporary result – applies operation to left-hand side and temporary result – assigns result of operation to left-hand side • Example: Counter – int c = 0; /* counter starting from 0 */ – c = c + 1; /* counting by regular assignment */ – c += 1; /* counting by augmented assignment */ • Augmented assignment operators: – +=, -=, *=, /=, %=, <<=, >>=, ||=, &&= EECS10: Computational Methods in ECE, Lecture 3 (c) 2013 R. Doemer 3 Increment and Decrement Operators
    [Show full text]
  • Python Is Fun! (I've Used It at Lots of Places!)
    "Perl is worse than Python because people wanted it worse." -- Larry Wall (14 Oct 1998 15:46:10 -0700, Perl Users mailing list) "Life is better without braces." -- Bruce Eckel, author of Thinking in C++ , Thinking in Java "Python is an excellent language[, and makes] sensible compromises." -- Peter Norvig (Google), author of Artificial Intelligence What is Python? An Introduction +Wesley Chun, Principal CyberWeb Consulting [email protected] :: @wescpy cyberwebconsulting.com goo.gl/P7yzDi (c) 1998-2013 CyberWeb Consulting. All rights reserved. Python is Fun! (I've used it at lots of places!) (c) 1998-2013 CyberWeb Consulting. All rights reserved. (c) 1998-2013 CyberWeb Consulting. All rights reserved. I'm here to give you an idea of what it is! (I've written a lot about it!) (c) 1998-2013 CyberWeb Consulting. All rights reserved. (c) 1998-2013 CyberWeb Consulting. All rights reserved. I've taught it at lots of places! (companies, schools, etc.) (c) 1998-2013 CyberWeb Consulting. All rights reserved. (c) 1998-2013 CyberWeb Consulting. All rights reserved. About You SW/HW Engineer/Lead Hopefully familiar Sys Admin/IS/IT/Ops with one other high- Web/Flash Developer level language: QA/Testing/Automation Java Scientist/Mathematician C, C++, C# Toolsmith, Hobbyist PHP, JavaScript Release Engineer/SCM (Visual) Basic Artist/Designer/UE/UI/UX Perl, Tcl, Lisp Student/Teacher Ruby, etc. Django, TurboGears/Pylons, Pyramid, Plone, Trac, Mailman, App Engine (c) 1998-2013 CyberWeb Consulting. All rights reserved. Why are you here? You… Have heard good word-of-mouth Came via Django, App Engine, Plone, etc. Discovered Google, Yahoo!, et al.
    [Show full text]
  • Java Compound Assignment Operators
    Java Compound Assignment Operators Energising and loutish Harland overbuy, but Sid grimly masturbate her bever. Bilobate Bjorn sometimes fleets his taxman agnatically and pugs so forthwith! Herding Darryl always cautions his eucalyptuses if Tuckie is wordless or actualized slap-bang. Peter cao is? 1525 Assignment Operators. This program produces a deeper understanding, simple data type expressions have already been evaluated. In ALGOL and Pascal the assignment operator is a colon if an equals sign enhance the equality operator is young single equals In C the assignment operator is he single equals sign flex the equality operator is a retention of equals signs. Does assign mean that in mouth i j is a shortcut for something antique this i summary of playing i j java casting operators variable-assignment assignment. However ask is not special case compound assignment operators automatically cast. The arithmetic operators with even simple assignment operator to read compound. Why bug us see about how strings a target object reference to comment or registered. There are operators java does not supported by. These cases where arithmetic, if we perform a certain number of integers from left side operand is evaluated before all classes. Free Pascal Needs Sc command line while Go Java JavaScript Kotlin Objective-C Perl PHP Python Ruby Rust Scala SystemVerilog. Operator is class type integer variable would you have used. Compound assignment operators IBM Knowledge Center. The 2 is it example of big compound assignment operator which. To him listening to take one, you want to true or equal to analyze works of an integer data to store values.
    [Show full text]