You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							183 lines
						
					
					
						
							5.6 KiB
						
					
					
				
			
		
		
	
	
							183 lines
						
					
					
						
							5.6 KiB
						
					
					
				| <!doctype html>
 | |
| 
 | |
| <title>CodeMirror: Ruby mode</title>
 | |
| <meta charset="utf-8"/>
 | |
| <link rel=stylesheet href="../../doc/docs.css">
 | |
| 
 | |
| <link rel="stylesheet" href="../../lib/codemirror.css">
 | |
| <script src="../../lib/codemirror.js"></script>
 | |
| <script src="../../addon/edit/matchbrackets.js"></script>
 | |
| <script src="ruby.js"></script>
 | |
| <style>
 | |
|       .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
 | |
|       .cm-s-default span.cm-arrow { color: red; }
 | |
|     </style>
 | |
| <div id=nav>
 | |
|   <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
 | |
| 
 | |
|   <ul>
 | |
|     <li><a href="../../index.html">Home</a>
 | |
|     <li><a href="../../doc/manual.html">Manual</a>
 | |
|     <li><a href="https://github.com/codemirror/codemirror">Code</a>
 | |
|   </ul>
 | |
|   <ul>
 | |
|     <li><a href="../index.html">Language modes</a>
 | |
|     <li><a class=active href="#">Ruby</a>
 | |
|   </ul>
 | |
| </div>
 | |
| 
 | |
| <article>
 | |
| <h2>Ruby mode</h2>
 | |
| <form><textarea id="code" name="code">
 | |
| # Code from http://sandbox.mc.edu/~bennet/ruby/code/poly_rb.html
 | |
| #
 | |
| # This program evaluates polynomials.  It first asks for the coefficients
 | |
| # of a polynomial, which must be entered on one line, highest-order first.
 | |
| # It then requests values of x and will compute the value of the poly for
 | |
| # each x.  It will repeatly ask for x values, unless you the user enters
 | |
| # a blank line.  It that case, it will ask for another polynomial.  If the
 | |
| # user types quit for either input, the program immediately exits.
 | |
| #
 | |
| 
 | |
| #
 | |
| # Function to evaluate a polynomial at x.  The polynomial is given
 | |
| # as a list of coefficients, from the greatest to the least.
 | |
| def polyval(x, coef)
 | |
|     sum = 0
 | |
|     coef = coef.clone           # Don't want to destroy the original
 | |
|     while true
 | |
|         sum += coef.shift       # Add and remove the next coef
 | |
|         break if coef.empty?    # If no more, done entirely.
 | |
|         sum *= x                # This happens the right number of times.
 | |
|     end
 | |
|     return sum
 | |
| end
 | |
| 
 | |
| #
 | |
| # Function to read a line containing a list of integers and return
 | |
| # them as an array of integers.  If the string conversion fails, it
 | |
| # throws TypeError.  If the input line is the word 'quit', then it
 | |
| # converts it to an end-of-file exception
 | |
| def readints(prompt)
 | |
|     # Read a line
 | |
|     print prompt
 | |
|     line = readline.chomp
 | |
|     raise EOFError.new if line == 'quit' # You can also use a real EOF.
 | |
|             
 | |
|     # Go through each item on the line, converting each one and adding it
 | |
|     # to retval.
 | |
|     retval = [ ]
 | |
|     for str in line.split(/\s+/)
 | |
|         if str =~ /^\-?\d+$/
 | |
|             retval.push(str.to_i)
 | |
|         else
 | |
|             raise TypeError.new
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return retval
 | |
| end
 | |
| 
 | |
| #
 | |
| # Take a coeff and an exponent and return the string representation, ignoring
 | |
| # the sign of the coefficient.
 | |
| def term_to_str(coef, exp)
 | |
|     ret = ""
 | |
| 
 | |
|     # Show coeff, unless it's 1 or at the right
 | |
|     coef = coef.abs
 | |
|     ret = coef.to_s     unless coef == 1 && exp > 0
 | |
|     ret += "x" if exp > 0                               # x if exponent not 0
 | |
|     ret += "^" + exp.to_s if exp > 1                    # ^exponent, if > 1.
 | |
| 
 | |
|     return ret
 | |
| end
 | |
| 
 | |
| #
 | |
| # Create a string of the polynomial in sort-of-readable form.
 | |
| def polystr(p)
 | |
|     # Get the exponent of first coefficient, plus 1.
 | |
|     exp = p.length
 | |
| 
 | |
|     # Assign exponents to each term, making pairs of coeff and exponent,
 | |
|     # Then get rid of the zero terms.
 | |
|     p = (p.map { |c| exp -= 1; [ c, exp ] }).select { |p| p[0] != 0 }
 | |
| 
 | |
|     # If there's nothing left, it's a zero
 | |
|     return "0" if p.empty?
 | |
| 
 | |
|     # *** Now p is a non-empty list of [ coef, exponent ] pairs. ***
 | |
| 
 | |
|     # Convert the first term, preceded by a "-" if it's negative.
 | |
|     result = (if p[0][0] < 0 then "-" else "" end) + term_to_str(*p[0])
 | |
| 
 | |
|     # Convert the rest of the terms, in each case adding the appropriate
 | |
|     # + or - separating them.  
 | |
|     for term in p[1...p.length]
 | |
|         # Add the separator then the rep. of the term.
 | |
|         result += (if term[0] < 0 then " - " else " + " end) + 
 | |
|                 term_to_str(*term)
 | |
|     end
 | |
| 
 | |
|     return result
 | |
| end
 | |
|         
 | |
| #
 | |
| # Run until some kind of endfile.
 | |
| begin
 | |
|     # Repeat until an exception or quit gets us out.
 | |
|     while true
 | |
|         # Read a poly until it works.  An EOF will except out of the
 | |
|         # program.
 | |
|         print "\n"
 | |
|         begin
 | |
|             poly = readints("Enter a polynomial coefficients: ")
 | |
|         rescue TypeError
 | |
|             print "Try again.\n"
 | |
|             retry
 | |
|         end
 | |
|         break if poly.empty?
 | |
| 
 | |
|         # Read and evaluate x values until the user types a blank line.
 | |
|         # Again, an EOF will except out of the pgm.
 | |
|         while true
 | |
|             # Request an integer.
 | |
|             print "Enter x value or blank line: "
 | |
|             x = readline.chomp
 | |
|             break if x == ''
 | |
|             raise EOFError.new if x == 'quit'
 | |
| 
 | |
|             # If it looks bad, let's try again.
 | |
|             if x !~ /^\-?\d+$/
 | |
|                 print "That doesn't look like an integer.  Please try again.\n"
 | |
|                 next
 | |
|             end
 | |
| 
 | |
|             # Convert to an integer and print the result.
 | |
|             x = x.to_i
 | |
|             print "p(x) = ", polystr(poly), "\n"
 | |
|             print "p(", x, ") = ", polyval(x, poly), "\n"
 | |
|         end
 | |
|     end
 | |
| rescue EOFError
 | |
|     print "\n=== EOF ===\n"
 | |
| rescue Interrupt, SignalException
 | |
|     print "\n=== Interrupted ===\n"
 | |
| else
 | |
|     print "--- Bye ---\n"
 | |
| end
 | |
| </textarea></form>
 | |
|     <script>
 | |
|       var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
 | |
|         mode: "text/x-ruby",
 | |
|         matchBrackets: true,
 | |
|         indentUnit: 4
 | |
|       });
 | |
|     </script>
 | |
| 
 | |
|     <p><strong>MIME types defined:</strong> <code>text/x-ruby</code>.</p>
 | |
| 
 | |
|     <p>Development of the CodeMirror Ruby mode was kindly sponsored
 | |
|     by <a href="http://ubalo.com/">Ubalo</a>.</p>
 | |
| 
 | |
|   </article>
 | |
| 
 |