123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <!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>
|