﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Millisecond Forums » Millisecond Forums » Inquisit 6  » Bug in /stop attribute?</title><generator>InstantForum 2017-1 Final</generator><description>Millisecond Forums</description><link>https://forums.millisecond.com/</link><webMaster>Millisecond Forums</webMaster><lastBuildDate>Mon, 28 Sep 2026 23:57:14 GMT</lastBuildDate><ttl>20</ttl><item><title>Bug in /stop attribute?</title><link>https://forums.millisecond.com/Topic36537.aspx</link><description>Dear all,&lt;br/&gt;&lt;br/&gt;I think I've stumbled on a bug: the / stop attribute (at least in expt elements) is sometimes not evaluated correctly. The following code provides an example:&lt;br/&gt;&lt;br/&gt;[code]&amp;lt;values&amp;gt;&lt;br/&gt;/ TestStop = false&lt;br/&gt;/ OtherStop = false&lt;br/&gt;&amp;lt;/values&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;expt MinimalExample&amp;gt;&lt;br/&gt;/ blocks = [1 = HelloWorld]&lt;br/&gt;/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.TestStop; values.OtherStop&lt;br/&gt;]&lt;br/&gt;&amp;lt;/expt&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;block HelloWorld&amp;gt;&lt;br/&gt;/ trials = [1 = HelloWorld]&lt;br/&gt;&amp;lt;/block&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;trial HelloWorld&amp;gt;&lt;br/&gt;/ stimulustimes = [0 = HelloWorld]&lt;br/&gt;/ timeout = 2000&lt;br/&gt;&amp;lt;/trial&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;text HelloWorld&amp;gt;&lt;br/&gt;/ items = ("Hello World!")&lt;br/&gt;&amp;lt;/text&amp;gt;[/code]&lt;br/&gt;&lt;br/&gt;This runs as expected, the trial is displayed. The / stop attribute is expected to fire if EITHER values.TestStop OR values.OtherStop OR both are true, preventing the trial from displaying.&lt;br/&gt;&lt;br/&gt;If only OtherStop is true or if both are true, /stop acts as expected. However, if ONLY TestStop is true, the stop condition doesn't fire and the trial displays.&lt;br/&gt;&lt;br/&gt;For now, a workaround would be to avoid listing /stop statements with semicolons and instead connect them via || (or) operators:&lt;br/&gt;&lt;br/&gt;[code]&amp;lt;expt MinimalExample&amp;gt;&lt;br/&gt;/ blocks = [1 = HelloWorld]&lt;br/&gt;/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.TestStop || values.OtherStop&lt;br/&gt;]&lt;br/&gt;&amp;lt;/expt&amp;gt;&lt;br/&gt;[/code]&lt;br/&gt;&lt;br/&gt;</description><pubDate>Fri, 13 Sep 2024 11:46:52 GMT</pubDate><dc:creator>AKrishna</dc:creator></item><item><title>RE: Bug in /stop attribute?</title><link>https://forums.millisecond.com/Topic36539.aspx</link><description>&lt;blockquote data-id="36537" class="if-quote-wrapper" unselectable="on" data-guid="1726227037614" contenteditable="false" id="if_insertedNode_1726227036565"&gt;&lt;a class="quote-para" unselectable="on" style="display: none;" href="#" data-id="36537" title="Move Cursor Below" contenteditable="false"&gt;&lt;span unselectable="on"&gt;+&lt;/span&gt;&lt;/a&gt;&lt;a class="quote-delete" unselectable="on" style="display: none;" href="#" data-id="36537" title="Delete Quote" contenteditable="false"&gt;&lt;span unselectable="on"&gt;x&lt;/span&gt;&lt;/a&gt;&lt;span unselectable="on" class="quote-markup"&gt;[quote]&lt;/span&gt;&lt;div unselectable="on" class="if-quote-header" contenteditable="false"&gt;&lt;div unselectable="on" class="if-quote-toggle-wrapper"&gt;&lt;a class="if-quote-toggle quote-link" href="#" data-id="36537" title=" "&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;span unselectable="on" class="quote-markup"&gt;[b]&lt;/span&gt;AKrishna - 9/13/2024&lt;span unselectable="on" class="quote-markup"&gt;[/b]&lt;/span&gt;&lt;/div&gt;&lt;div class="if-quote-message if-quote-message-36537"&gt;&lt;div class="if-quote-message-margin" contenteditable="true"&gt;Dear all,&lt;br/&gt;&lt;br/&gt;I think I've stumbled on a bug: the / stop attribute (at least in expt elements) is sometimes not evaluated correctly. The following code provides an example:&lt;br/&gt;&lt;br/&gt;[code]&amp;lt;values&amp;gt;&lt;br/&gt;/ TestStop = false&lt;br/&gt;/ OtherStop = false&lt;br/&gt;&amp;lt;/values&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;expt MinimalExample&amp;gt;&lt;br/&gt;/ blocks = [1 = HelloWorld]&lt;br/&gt;/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.TestStop; values.OtherStop&lt;br/&gt;]&lt;br/&gt;&amp;lt;/expt&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;block HelloWorld&amp;gt;&lt;br/&gt;/ trials = [1 = HelloWorld]&lt;br/&gt;&amp;lt;/block&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;trial HelloWorld&amp;gt;&lt;br/&gt;/ stimulustimes = [0 = HelloWorld]&lt;br/&gt;/ timeout = 2000&lt;br/&gt;&amp;lt;/trial&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;text HelloWorld&amp;gt;&lt;br/&gt;/ items = ("Hello World!")&lt;br/&gt;&amp;lt;/text&amp;gt;[/code]&lt;br/&gt;&lt;br/&gt;This runs as expected, the trial is displayed. The / stop attribute is expected to fire if EITHER values.TestStop OR values.OtherStop OR both are true, preventing the trial from displaying.&lt;br/&gt;&lt;br/&gt;If only OtherStop is true or if both are true, /stop acts as expected. However, if ONLY TestStop is true, the stop condition doesn't fire and the trial displays.&lt;br/&gt;&lt;br/&gt;For now, a workaround would be to avoid listing /stop statements with semicolons and instead connect them via || (or) operators:&lt;br/&gt;&lt;br/&gt;[code]&amp;lt;expt MinimalExample&amp;gt;&lt;br/&gt;/ blocks = [1 = HelloWorld]&lt;br/&gt;/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.TestStop || values.OtherStop&lt;br/&gt;]&lt;br/&gt;&amp;lt;/expt&amp;gt;&lt;br/&gt;[/code]&lt;br/&gt;&lt;br/&gt;&lt;a class="if-quote-goto quote-link" href="#" data-id="36537"&gt;&lt;span class="goto"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;span unselectable="on" class="quote-markup"&gt;[/quote]&lt;/span&gt;&lt;/blockquote&gt;&lt;br/&gt;So, it's not a bug, but the documentation is unclear / somewhat wrong on this. Each /stop attribute is evaluated as a whole, and whatever the final result is the return value and determines whether a stop occurs or not.&lt;br/&gt;&lt;br/&gt;With &lt;br/&gt;&lt;br/&gt;[code]&amp;lt;values&amp;gt;&lt;br/&gt;/ TestStop = true&lt;br/&gt;/ OtherStop = false&lt;br/&gt;&amp;lt;/values&amp;gt;[/code]&lt;br/&gt;&lt;br/&gt;and&lt;br/&gt;&lt;br/&gt;[code]/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.TestStop;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values.OtherStop;&lt;br/&gt;][/code]&lt;br/&gt;&lt;br/&gt;the return value is false per values.OtherStop.&lt;br/&gt;&lt;br/&gt;With&lt;br/&gt;&lt;br/&gt;[code]/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return values.TestStop;&lt;br/&gt;]&lt;br/&gt;/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return values.OtherStop;&lt;br/&gt;][/code]&lt;br/&gt;&lt;br/&gt;the return value of the first /stop attribute is true per values.TestStop, so a stop occurs. The 2nd stop attribute is not evaluated.&lt;br/&gt;&lt;br/&gt;You can have multiple expressions in a single /stop attribute to achieve the same thing, e.g.&lt;br/&gt;&lt;br/&gt;[code]/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (values.TestStop) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (values.OtherStop) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br/&gt;][/code]&lt;br/&gt;&lt;br/&gt;The first conditional applies and returns true, the 2nd conditional does not apply, so nothing changes.&lt;br/&gt;&lt;br/&gt;And finally, as you noted, you can of course use a logical OR, which I would consider the clearest specification.&lt;br/&gt;&lt;br/&gt;[code]/ stop = [&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (values.TestStop || values.OtherStop)&lt;br/&gt;][/code]&lt;br/&gt;</description><pubDate>Fri, 13 Sep 2024 11:46:52 GMT</pubDate><dc:creator>Dave</dc:creator></item></channel></rss>