| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | <!doctype html><html>  <head>    <meta charset="utf-8">    <title>CodeMirror: Ruby mode</title>    <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>    <link rel="stylesheet" href="../../doc/docs.css">  </head>  <body>    <h1>CodeMirror: Ruby mode</h1>    <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 sumend## 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 exceptiondef 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 retvalend## 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 retend## 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 resultend        ## 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    endrescue 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",        tabMode: "indent",        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>, who hold    the <a href="LICENSE">license</a>.</p>  </body></html>
 |