scripts/CodeMirror/mode/ruby/index.html (view raw)
1<!doctype html>
2
3<title>CodeMirror: Ruby mode</title>
4<meta charset="utf-8"/>
5<link rel=stylesheet href="../../doc/docs.css">
6
7<link rel="stylesheet" href="../../lib/codemirror.css">
8<script src="../../lib/codemirror.js"></script>
9<script src="../../addon/edit/matchbrackets.js"></script>
10<script src="ruby.js"></script>
11<style>
12 .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
13 .cm-s-default span.cm-arrow { color: red; }
14 </style>
15<div id=nav>
16 <a href="https://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png" alt=""></a>
17
18 <ul>
19 <li><a href="../../index.html">Home</a>
20 <li><a href="../../doc/manual.html">Manual</a>
21 <li><a href="https://github.com/codemirror/codemirror">Code</a>
22 </ul>
23 <ul>
24 <li><a href="../index.html">Language modes</a>
25 <li><a class=active href="#">Ruby</a>
26 </ul>
27</div>
28
29<article>
30<h2>Ruby mode</h2>
31<form><textarea id="code" name="code">
32# Code from http://sandbox.mc.edu/~bennet/ruby/code/poly_rb.html
33#
34# This program evaluates polynomials. It first asks for the coefficients
35# of a polynomial, which must be entered on one line, highest-order first.
36# It then requests values of x and will compute the value of the poly for
37# each x. It will repeatly ask for x values, unless you the user enters
38# a blank line. It that case, it will ask for another polynomial. If the
39# user types quit for either input, the program immediately exits.
40#
41
42#
43# Function to evaluate a polynomial at x. The polynomial is given
44# as a list of coefficients, from the greatest to the least.
45def polyval(x, coef)
46 sum = 0
47 coef = coef.clone # Don't want to destroy the original
48 while true
49 sum += coef.shift # Add and remove the next coef
50 break if coef.empty? # If no more, done entirely.
51 sum *= x # This happens the right number of times.
52 end
53 return sum
54end
55
56#
57# Function to read a line containing a list of integers and return
58# them as an array of integers. If the string conversion fails, it
59# throws TypeError. If the input line is the word 'quit', then it
60# converts it to an end-of-file exception
61def readints(prompt)
62 # Read a line
63 print prompt
64 line = readline.chomp
65 raise EOFError.new if line == 'quit' # You can also use a real EOF.
66
67 # Go through each item on the line, converting each one and adding it
68 # to retval.
69 retval = [ ]
70 for str in line.split(/\s+/)
71 if str =~ /^\-?\d+$/
72 retval.push(str.to_i)
73 else
74 raise TypeError.new
75 end
76 end
77
78 return retval
79end
80
81#
82# Take a coeff and an exponent and return the string representation, ignoring
83# the sign of the coefficient.
84def term_to_str(coef, exp)
85 ret = ""
86
87 # Show coeff, unless it's 1 or at the right
88 coef = coef.abs
89 ret = coef.to_s unless coef == 1 && exp > 0
90 ret += "x" if exp > 0 # x if exponent not 0
91 ret += "^" + exp.to_s if exp > 1 # ^exponent, if > 1.
92
93 return ret
94end
95
96#
97# Create a string of the polynomial in sort-of-readable form.
98def polystr(p)
99 # Get the exponent of first coefficient, plus 1.
100 exp = p.length
101
102 # Assign exponents to each term, making pairs of coeff and exponent,
103 # Then get rid of the zero terms.
104 p = (p.map { |c| exp -= 1; [ c, exp ] }).select { |p| p[0] != 0 }
105
106 # If there's nothing left, it's a zero
107 return "0" if p.empty?
108
109 # *** Now p is a non-empty list of [ coef, exponent ] pairs. ***
110
111 # Convert the first term, preceded by a "-" if it's negative.
112 result = (if p[0][0] < 0 then "-" else "" end) + term_to_str(*p[0])
113
114 # Convert the rest of the terms, in each case adding the appropriate
115 # + or - separating them.
116 for term in p[1...p.length]
117 # Add the separator then the rep. of the term.
118 result += (if term[0] < 0 then " - " else " + " end) +
119 term_to_str(*term)
120 end
121
122 return result
123end
124
125#
126# Run until some kind of endfile.
127begin
128 # Repeat until an exception or quit gets us out.
129 while true
130 # Read a poly until it works. An EOF will except out of the
131 # program.
132 print "\n"
133 begin
134 poly = readints("Enter a polynomial coefficients: ")
135 rescue TypeError
136 print "Try again.\n"
137 retry
138 end
139 break if poly.empty?
140
141 # Read and evaluate x values until the user types a blank line.
142 # Again, an EOF will except out of the pgm.
143 while true
144 # Request an integer.
145 print "Enter x value or blank line: "
146 x = readline.chomp
147 break if x == ''
148 raise EOFError.new if x == 'quit'
149
150 # If it looks bad, let's try again.
151 if x !~ /^\-?\d+$/
152 print "That doesn't look like an integer. Please try again.\n"
153 next
154 end
155
156 # Convert to an integer and print the result.
157 x = x.to_i
158 print "p(x) = ", polystr(poly), "\n"
159 print "p(", x, ") = ", polyval(x, poly), "\n"
160 end
161 end
162rescue EOFError
163 print "\n=== EOF ===\n"
164rescue Interrupt, SignalException
165 print "\n=== Interrupted ===\n"
166else
167 print "--- Bye ---\n"
168end
169</textarea></form>
170 <script>
171 var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
172 mode: "text/x-ruby",
173 matchBrackets: true,
174 indentUnit: 4
175 });
176 </script>
177
178 <p><strong>MIME types defined:</strong> <code>text/x-ruby</code>.</p>
179
180 <p>Development of the CodeMirror Ruby mode was kindly sponsored
181 by <a href="http://ubalo.com/">Ubalo</a>.</p>
182
183 </article>